我与两个实体有一对多的关系:
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
,Product
,ProductType
返回所有订单,并按顺序字段对项目进行排序。如何编写查询,如下面的查询?
在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数据。 我的错在哪里?
答案 0 :(得分:3)
您需要先将所有来电置于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")
和.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 })
});
您投射到输出选择中的任何内容都将自动加载。像这样的急切加载在某些方面实际上是可取的,因为你只是实现你需要的东西,而不是完整的对象图。 (虽然在这种情况下,我们的实现与包含的内容相同。)