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

46

我刚接触 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()或*Reference属性时,实际上是在向数据库发出另一个调用。如果是这种情况,是否有办法在我的初始LINQ表达式中获取这些对象?

3个回答

66

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

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

Include也可能有针对"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提出的进一步问题,请参阅此问题


为什么我的 EF5 数据库没有 LoadOptions 属性? - mohsen
1
@mohsen 答案的第二部分是关于 LINQ to SQL 的,这是一个现在已经被放弃的框架。 - Robert Wagner
感谢提供“塑造查询结果”链接。 - Ehsan88
如果与其他dbSet连接,则第一个查询将无法工作。 - Emil
很遗憾,添加一个 include 在运行时会导致一个 not supported exception:/ - Douglas Gaskell

0

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接