0

假设我有一个 Order 实体和一个 OrderItem 实体,并且我试图一次获取多个订单的详细信息(包括项目)。

我可以.Include像这样使用 Order 和 OrderItem 详细信息:

var orders = db.Orders
               .Include(o => o.OrderItem)
               .Where(o => orderIds.Contains(o.Id));

但是,假设我不能使用.Include,因为它不起作用

相反,我可以获取所有订单,然后获取所有订单项,如下所示:

var orders = db.Orders.Where(o => orderIds.Contains(o.Id));

var orderItems = db.OrderItems.Where(i => orderIds.Contains(i.OrderId));

这将给我所有的订单和(单独)所有相关的订单项。但是如何将对象“附加”OrderItem到相关Order对象,以便导航属性正常工作?

(换句话说,我如何确保order.OrderItemsorderItem.Order在不导致 EF 从数据库中获取数据而不是使用我已经检索到的数据的情况下工作)。

4

2 回答 2

0

只是为了结束这个问题,这就是我所做/学到的:

1)正如 Slauma 在他的评论中指出的那样,即使OrdersOrderItems是单独获取的,EF 确实修复了导航属性,因此例如每个 OrderItem 的 Order 属性正确指向正确的Order

2) 不幸的是,EF 无法知道订单的所有OrderItems数据都已获取,因此如果Order.OrderItems导航属性是延迟加载的,那么访问该属性将导致 EF 从数据库中重新获取所有OrderItem数据 -它会每执行一次Order。显然不好。

3)避免上述问题的唯一方法似乎是删除该集合属性上的延迟加载(以及其他类似的集合 - 一对一的导航属性不受此问题的影响)。

于 2013-08-21T11:22:48.240 回答
0

关于您的最后一个问题 -how do I ensure that order.OrderItems and orderItem.Order work without causing EF to go fetch the data from the database ...您可以先将.Load()您的查询记入内存:

orders.Load();
orderItems.Load();

然后通过Local上下文的属性使用它们:

var qo = db.Orders.Local.Where(...);
var qoi = db.OrderItems.Local.Where(...);
于 2013-08-11T11:34:40.290 回答