8

我与两个实体有一对多关系:

Order:
int OrderId 
string OrderNumber
...

OrderItem:
int ItemId
int sequence
...

Product:
int ProductId
string ProductName

ProductType:
int ProductTypeid
string Title

一个Order有多个OrderItems,每个OrderItem都有一个Product,每个Product都有一个ProductType

我想编写一个 Linq,它返回所有订单,它们的,items和项目按序列字段排序。如何编写查询,例如以下查询?ProductProductType

在Order by with Linq的帮助下,我写了这个查询:

var myOrder= db.Orders.Include("OrderItems")
         .Where(x => x.OrderId == 3)
         .Include("OrderItems.Product") 
         .Include("OrderItems.Product.ProductType") 
         .Select(o => new {
             order = o,
             orderItems = o.OrderItems.OrderBy(i => i.sequence)
         }).FirstOrDefault();

但是当它返回结果时,它不包含 Product 和 ProductType 数据。我的错误在哪里?

4

1 回答 1

4

您需要先拨打所有电话Include()。这应该有效:

var myOrder= db.Orders.Include("OrderItems")
     .Include("OrderItems.Product") 
     .Include("OrderItems.Product.ProductType") 
     .Where(x => x.OrderId == 3)
     .Select(o => new {
         order = o,
         orderItems = o.OrderItems.OrderBy(i => i.sequence)
     }).FirstOrDefault();

此外,当您拥有 时.Include("OrderItems.Product.ProductType"),您不需要.Include("OrderItems")and .Include("OrderItems.Product"),因为它会在包含产品类型的过程中包含 OrderItems 及其产品。它必须这样做,否则您将无法在代码中导航到它们——它将它们附加到什么上?

在这种情况下,看起来这可以解释它:http ://wildermuth.com/2008/12/28/Caution_when_Eager_Loading_in_the_Entity_Framework

您可以在不使用包括的情况下绕过:

var query = db.Orders
.Where(x => x.OrderId == 3)
.Select(o => new {
order = o,
orderItems = o.OrderItems.OrderBy(i => i.sequence),
products = o.OrderItems.Select(i => new { i, i.Product, i.Product.ProductType })
});

您投射到输出选择中的任何内容都将自动预先加载。在某些方面,像这样的急切加载实际上是更可取的,因为您只是物化了您需要的东西,而不是完整的对象图。(尽管在这种情况下,我们实现的内容与包含的内容相同。)

于 2013-01-23T10:27:18.483 回答