C# 通过Linq和x2B订购;包括
我与两个实体有一对多关系:C# 通过Linq和x2B订购;包括,c#,linq,include,C#,Linq,Include,我与两个实体有一对多关系: Order: int OrderId string OrderNumber ... OrderItem: int ItemId int sequence ... Product: int ProductId string ProductName ProductType: int ProductTypeid string Title 一个订单有多个订单项,每个订单项有一个产品,每个产品有一个产品类型 我想写一个Linq,它返回所有订单及其项目、产品、产品类型,
Order:
int OrderId
string OrderNumber
...
OrderItem:
int ItemId
int sequence
...
Product:
int ProductId
string ProductName
ProductType:
int ProductTypeid
string Title
一个订单
有多个订单项
,每个订单项
有一个产品
,每个产品
有一个产品类型
我想写一个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();
但是当它返回结果时,它不包含产品和产品类型数据。
我的错在哪里 您需要首先将所有调用放入
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及其产品。它必须这样做,否则您将无法在代码中导航到它们——它会将它们附加到什么上
在这种情况下,这似乎可以解释:
您可以不使用以下工具四处走动:
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 })
});
您投射到输出选择中的任何内容都将自动加载。在某些方面,像这样的急切加载实际上更可取,因为您只是具体化了您需要的内容,而不是完整的对象图。(虽然在本例中,我们具体化的内容与包含的内容相同。)对于每个OrderItem,OrderItem上的外键是否为非null?(即ProductId)另外,
是否包括(o=>o.OrderItems.Select(oi=>oi.Product.ProductType))
工作?(如果您还没有,则需要添加对System.Data.Entity
的引用。)OrderItem中的ProductId可以为null,但OrderItems的ProductId(OrderId=3)不是null否。Include(o=>o.OrderItems.Select(oi=>oi.Product.ProductType))不会为我们提供可能的重复项