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



这个快把我逼疯了!为简单起见,我不打算列出用于DDD的全部代码,而只是公开我所尝试过的代码,并解释哪些代码不起作用。

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

Products(保存产品数据)
订单(保存已输入的订单)
OrderProducts (order和Product之间的ref)

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

我通过id获取Order,结果是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,令我惊讶的是,它仍然从这个订单加载所有的OrderProducts !

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

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

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

最新更新