Entity Framework & Linq Orderby



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

我们希望在ONE TRIP到数据库中获取所有表的所有记录能够对每个表进行排序。

我们知道我们可以使用像context.Customers.Include("Orders.OrderItems")这样的include扩展来急切加载所有数据。但是当我们尝试预订每张桌子时,总是会出现错误。例如,我们希望按CustomerId列订购Customer表,按Date列订购Orders表,按ProductId列订购OrderItems。

感谢您的帮助

如果您有导航属性OrderItemOrder和从OrderCustomer,那么您可以获得有序的' OrderItems',您可以这样实现:

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

最新更新