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

时间:2008-11-25 00:22:41

标签: c# linq linq-to-entities

我是新手使用LINQ to Entities(或实体框架,无论他们调用它),我写了很多这样的代码:

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()或* Reference属性时,我实际上正在再次调用数据库。如果是这种情况,有没有办法在我的初始LINQ表达式中获取这些对象?

3 个答案:

答案 0 :(得分:61)

您希望在此"Shaping query results"文章中使用.Include(字符串)方法引用。

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

“包含”可能还有“sql”样式语法。

另请参阅此article关于从LINQ-to-SQL转移到LINQ-to-Entities。

对于其他寻找 Linq to SQL 此问题的解决方案的人,您希望执行以下操作(替换DataContext和其他类型的任何内容):

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

每当加载父项(InventoryItem)时,这将加载LoadWith中指定的属性,用于该特定上下文。

在回答James和Jesper的其他一些问题时,请查看question

答案 1 :(得分:0)

除了Robert的回答之外,您可能想查看这个问题以获取扩展方法的选项,该方法允许您使用表达式而不是字符串来使用.Include(),因此您可以获得编译时检查:

Entity Framework .Include() with compile time checking?

答案 2 :(得分:0)

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