DDD和实体框架:从聚合根中提取子项

时间:2013-03-01 15:27:14

标签: entity-framework

这个让我疯了! 为简单起见,我不会提出用于我们的DDD的整个代码,而只是暴露我尝试过的内容并解释什么不起作用。

我有一个简单的数据库结构:

产品(保存产品数据)
订单(保留订单)
OrderProducts(订单和产品之间的参考表)

我有一个Order聚合根,我想提取一个简单订单的产品数。

我通过id获取订单,这导致了一个EF lambda:

var order = _orderRepository.Get(orderId);    

然后,我尝试使用以下顺序提取产品数量:

var count = order.OrderProducts.Count();

当一个订单有很多记录时,这一行会被扼杀,因为它正在取出所有这些记录。精细。 所以,我通过在我的订单中添加一些过滤器到我想要计算的产品来改进它。 产品有一些属性,包括一个类型(因此,有一个类型ID)。 所以,现在我正在尝试这个:

//This is trimming down my results to about a dozen products)
var count = order.OrderProduct
                 .Where(op=>op.Product.TypeId == 2)
                 .Count();  

如果我使用Linqpad来查看生成了哪种SQL,令我惊讶的是,它仍然从该订单加载所有订单产品!

如何强制它直接在查询中应用过滤器?

1 个答案:

答案 0 :(得分:1)

它正在加载所有这些因为一旦你触摸导航属性(即order.OrderProducts),就会急切加载并加载所有这些属性(即使是你不想要的那些)。减少这种情况的唯一选择是在给定orderID的情况下查询数据库本身。也许是这样的:

_orderProductRepository.Where(p => p.OrderID == orderId && p.Product.TypeID == 2);