1

这个快把我逼疯了!为简单起见,我不会列出用于我们的 DDD 的整个代码,而只是公开我尝试过的内容并解释什么不起作用。

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

Products(保存产品数据)
Orders(保存输入的订单)
OrderProducts(订单和产品之间的参考表)

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

我通过 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!

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

4

1 回答 1

1

它正在加载所有这些,因为一旦您触摸导航属性(即order.OrderProducts)急切加载就会启动并加载所有它们(即甚至是您不想要的那些)。减少这种情况的唯一选择是在给定orderID. 也许是这样的:

_orderProductRepository.Where(p => p.OrderID == orderId && p.Product.TypeID == 2);
于 2013-03-01T16:01:12.207 回答