我想知道在执行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);

Prefer(真的很喜欢,如果这样就加载了MailingAddress)

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

或者至少(注意:类似于此,使用MailingAddressReference,如果我在服务操作中执行LINQ to Entities,则在服务器端工作)

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);
有帮助吗?

解决方案

通过ADO.net加载子对象数据服务似乎有两种选择:

渴望加载

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

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);

其他提示

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

me = me.Include("MailingAddress");
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top