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))不会为我们提供可能的重复项