使用Linq + Include进行排序

8

我有两个实体之间的一对多关系:

Order:
int OrderId 
string OrderNumber
...

OrderItem:
int ItemId
int sequence
...

Product:
int ProductId
string ProductName

ProductType:
int ProductTypeid
string Title

一个订单包含多个订单项,每个订单项对应一个产品,每个产品属于一种产品类型。

我想写一个 Linq 查询,返回所有订单及其订单项、产品和产品类型,并按照序列字段对订单项进行排序。我应该如何编写查询?

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();

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


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").Include("OrderItems.Product"),因为它会在包含产品类型的同时包含OrderItems及其产品。 这是必须这样做的,否则您将无法在代码中导航到它们 - 它会将它们附加到哪里呢?
在这种情况下,看起来这可能会解释它:http://wildermuth.com/2008/12/28/Caution_when_Eager_Loading_in_the_Entity_Framework 您可以避免使用includes:
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上的外键(即ProductId)是否非空? - Bennor McCarthy
另外,.Include(o => o.OrderItems.Select(oi => oi.Product.ProductType)) 是否可行?(如果您尚未添加引用“System.Data.Entity”,则需要添加。) - Bennor McCarthy
OrderItem中的ProductId是可空的,但是OrderId = 3的OrderItems的ProductId不为null。 - Masoud
1
.Include(o => o.OrderItems.Select(oi => oi.Product.ProductType)) 不起作用。 - Masoud
是指出现错误了吗?还是只是没有包括该产品? - Bennor McCarthy
1
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/23210/discussion-between-bennor-mccarthy-and-masoud - Bennor McCarthy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接