我与两个实体有一对多关系:
Order:
int OrderId
string OrderNumber
...
OrderItem:
int ItemId
int sequence
...
Product:
int ProductId
string ProductName
ProductType:
int ProductTypeid
string Title
One Order
拥有多个OrderItems
,以及每个OrderItem
有一个Product
和每个Product
有一个ProductType
.
我想写一个 Linq 来返回所有订单及其items
,Product
,ProductType
和项目按序列字段排序。如何编写查询,例如以下查询?
在帮助下使用 Linq 排序 https://stackoverflow.com/questions/14474320/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 数据。
我的错误在哪里?
您需要将所有呼叫转至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 http://wildermuth.com/2008/12/28/Caution_when_Eager_Loading_in_the_Entity_Framework
您可以在不使用 include 的情况下绕过:
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 })
});
您投影到输出选择中的任何内容都将自动预先加载。像这样的预加载实际上在某些方面更可取,因为您只是具体化了您需要的内容,而不是完整的对象图。 (尽管在本例中我们实现的内容与包含内容相同。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)