假设我有一个Order实体和一个OrderItem实体,并且我正在尝试一次获取多个订单的详细信息(包括项目)。
我可以使用.Include
来获取Order和OrderItem的详细信息,如下所示:
var orders = db.Orders
.Include(o => o.OrderItem)
.Where(o => orderIds.Contains(o.Id));
但是,假设我无法使用.Include
因为it doesn't work。
相反,我可以获取所有订单,然后获取所有OrderItems,如下所示:
var orders = db.Orders.Where(o => orderIds.Contains(o.Id));
var orderItems = db.OrderItems.Where(i => orderIds.Contains(i.OrderId));
这将给我所有订单和(单独)所有相关的OrderItems。但是,如何将OrderItem
对象“附加”到相关的Order
对象,以便导航属性正常工作?
(换句话说,我如何确保order.OrderItems
和orderItem.Order
工作而不会导致EF从数据库中获取数据而不是使用我已经检索过的数据。
答案 0 :(得分: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(...);
答案 1 :(得分:0)
只是结束这个问题,这就是我所做的/学到的:
1)正如Slauma在他的评论中指出的那样,即使单独提取Orders
和OrderItems
,EF确实会修复导航属性,因此例如每个OrderItem的Order属性都正确指向到正确的Order
。
2)不幸的是,EF无法知道订单的OrderItems
的所有已被提取,因此如果Order.OrderItems
导航属性是懒惰的 - 加载,然后访问该属性将导致EF重新获取数据库中的所有OrderItem
数据 - 它将按Order
执行此操作。显然不好。
3)避免上述问题的唯一方法似乎是删除该集合属性上的延迟加载(以及其他类似集合 - 一对一导航属性不受此问题的影响)。