如何构造一个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