实体框架& Linq Orderby

时间:2016-10-08 19:07:02

标签: linq entity-framework-6

我们在使用EF6的MVC应用程序中有3个表关系。例如,与订单表(多方面)和订单表相关的客户表与OrderItems表(多方)相关。

我们希望在数据库的 ONE TRIP 中获取所有表的所有记录能够订购每个表。

我们知道我们可以像context.Customers.Include(“Orders.OrderItems”)一样使用include扩展来急切加载所有数据。但是当我们尝试订购每张桌子时,我们一直都会遇到错误。 例如,我们希望按CustomerId列订购Customer Table,按日期订购Orders Table列,按ProductId列订购OrderItems。

任何协助都是apreciated

1 个答案:

答案 0 :(得分:0)

如果您有OrderItemOrder以及OrderCustomer导航属性,那么您可以订购`OrderItems&#39 ;你可以这样做:

var orderItems = context.OrderItems
    // Filter if needed with .When
    .Include(m => m.Order.Customer)
    .OrderBy(m => m.Order.Customer.CustomerId)
    .ThenBy(m => m.Order.Date)
    .ThenBy(m => m.ProducetId)
    .ToList();

但是,如果您想获得客户,您可以做的是加载订购的客户,如:

var customers = context.Custoemr
    .Include(m => m.Orders.Select(o => o.OrderItem))
    .OrderBy(m => m.CustomerId)
    .ToList();

然后订购OrderOrderItem。由于您已加载所有数据,因此订购集合不会进行任何数据库调用,并且它将保持一次性访问数据库

foreach(Customer customer in customers)
{
    customer.Orders = customer.Orders.OrderBy(m => m.Date);
    foreach (Order order in customer.Orders)
    {
        order.OrderItems = order.OrderItems.OrderBy(m => m.ProducetId);
    }
}