这个让我疯了! 为简单起见,我不会提出用于我们的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,令我惊讶的是,它仍然从该订单加载所有订单产品!
如何强制它直接在查询中应用过滤器?
答案 0 :(得分:1)
它正在加载所有这些因为一旦你触摸导航属性(即order.OrderProducts
),就会急切加载并加载所有这些属性(即使是你不想要的那些)。减少这种情况的唯一选择是在给定orderID
的情况下查询数据库本身。也许是这样的:
_orderProductRepository.Where(p => p.OrderID == orderId && p.Product.TypeID == 2);