我们在使用EF6的MVC应用程序中有一个3表关系。例如,客户表与订单表(多方)相关,订单表与OrderItems表(多方)相关。
我们希望在ONE TRIP到数据库中获取所有表的所有记录和能够对每个表进行排序。
我们知道我们可以使用像context.Customers.Include("Orders.OrderItems")这样的include扩展来急切加载所有数据。但是当我们尝试预订每张桌子时,总是会出现错误。例如,我们希望按CustomerId列订购Customer表,按Date列订购Orders表,按ProductId列订购OrderItems。
感谢您的帮助
如果您有导航属性从OrderItem
到Order
和从Order
到Customer
,那么您可以获得有序的' 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();
然后订购Order
和OrderItem
。当您加载了所有数据后,排序集合将不会进行任何数据库调用,并且它将保持一次访问数据库:
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);
}
}