5

我想知道在执行 LINQ to ADO.net 数据服务查询时是否有任何替代方法可以使用 Expand 关键字。expand 方法确实为我提供了我感兴趣的数据,但它要求我提前了解我将要使用的所有子对象。我的绝对偏好是,当我访问这些子对象时,它们会为我延迟加载,但这看起来不是一个选项(我可以将此延迟加载添加到该子对象属性的 get 中,但它当我更新数据服务引用时被清除)。

有没有人对这种情况有任何建议/最佳实践/替代方案?谢谢。

===== 使用具有 MailingAddress 的成员的示例代码 =====

作品:

var me = (from m in ctx.Member.Expand("MailingAddress")
          where m.MemberID == 10000
          select m).First();
MessageBox.Show(me.MailingAddress.Street);

会更喜欢(如果这然后加载MailingAddress,真的很喜欢)

var me = (from m in ctx.Member
          where m.MemberID == 10000
          select m).First();
MessageBox.Show(me.MailingAddress.Street);

或者至少(注意:如果我在服务操作中作为 LINQ to Entities 这样做,则与 MailingAddressReference 类似的东西在服务器端工作)

var me = (from m in ctx.Member
          where m.MemberID == 10000
          select m).First();
if (!(me.MailingAddress.IsLoaded())) me.MailingAddress.Load()
MessageBox.Show(me.MailingAddress.Street);
4

2 回答 2

9

通过 ADO.net Data Services 加载子对象似乎有两种选择:

急切加载

由 .Expand("[MemberVariableName]") 在 LINQ to Data Services 示例中完成

var me = (from m in ctx.Member.Expand("MailingAddress")          
         where m.MemberID == 10000          
         select m).First();
MessageBox.Show(me.MailingAddress.Street);

延迟加载

通过在上下文上调用 .LoadProperty 并将其传递给应该延迟加载的变量和属性来完成。

var me = (from m in ctx.Member          
          where m.MemberID == 10000          
          select m).First();
ctx.LoadProperty(myMember, "MailingAddresses");
MessageBox.Show(me.MailingAddress.Street);
于 2008-10-10T03:27:33.630 回答
3

借助 LINQ to Entities,您还可以使用Include 方法。您可以在声明之后但在执行之前将其应用于我,例如:

me = me.Include("MailingAddress");
于 2008-10-07T13:18:10.413 回答