如何构造一个LINQ to Entities查询来直接加载子对象,而不是调用Reference属性或Load()

我是新来的使用LINQ to Entities(或者Entity Framework,无论他们在调用它),我写了很多这样的代码:

var item = (from InventoryItem item in db.Inventory where item.ID == id select item).First<InventoryItem>(); 

然后调用这个对象的方法如下:

 var type = item.ItemTypeReference; 

要么

 var orders = item.OrderLineItems.Load(); 

检索儿童或相关对象。

我没有分析数据库或挖得太深,但我的猜测是,当我调用一个.Load()或一个*引用属性,我实际上是另一个调用数据库。 如果是这样的话,有什么办法让我的初始LINQexpression式中的那些对象?

您想在此“Shaping查询结果”文章中使用.Include(string)方法引用。

 var item = from InventoryItem item in db.Inventory.Include("ItemTypeReference").Include("OrderLineItems") where item.ID == id select item; 

对于Includes也可能有一个“sql”风格的语法。

另请参阅关于从LINQ到SQL到LINQ-to-Entities的文章。

对于其他寻找Linq to SQL这个问题的解决scheme,你想要做以下的事情(replaceDataContext和其他types的任何你有):

 using (DataContext db = new DataContext()) { DataLoadOptions options = new DataLoadOptions(); options.LoadWith<InventoryItem>(ii => ii.ItemTypeReference); options.LoadWith<InventoryItem>(ii => ii.OrderLineItems); db.LoadOptions = options; var item = from InventoryItem item in db.Inventory where item.ID == id select item; } 

这将加载LoadWith中指定的属性,只要父项(InventoryItem)被加载,对于特定的上下文。

为了回应James和Jesper的一些进一步的问题,请看看这个问题

除了罗伯特的答案,你可能想看看这个问题的扩展方法的选项,它允许你.include()使用expression式,而不是一个string,所以你得到编译时间检查:

包含()与编译时检查?

AFAIK,对于silverlight(域服务)添加[Include]属性到正确的位置(在导航属性的元数据)是足够的https://stackoverflow.com/a/5332188/413032