46

我不熟悉使用 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 表达式中获取这些对象?

4

3 回答 3

65

您想在这篇“塑造查询结果”一文中使用 .Include(string) 方法引用。

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

Includes 也可能有一个“sql”样式的语法。

另请参阅这篇关于从 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 提出的一些进一步问题,请查看这个问题

于 2008-11-25T00:29:40.117 回答
0

除了罗伯特的回答之外,您可能还想查看此问题以了解扩展方法的选项,该方法允许您使用表达式而不是字符串来 .Include() ,因此您可以进行编译时检查:

带有编译时检查的实体框架 .Include()?

于 2013-03-08T14:09:14.683 回答
0

AFAIK, For silverlight(domain services) adding [Include] attribute to right place(over navigation property in metadata) is enough https://stackoverflow.com/a/5332188/413032

于 2013-03-23T14:24:01.860 回答