2013-03-01 67 views
1

这是一个让我疯狂的! 为简单起见,我不会提出用于我们的DDD的整个代码,而只是公开我尝试过的内容,并解释什么是不工作的。DDD和实体框架:从聚合根拉儿童

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

产品(持有产品数据)
订单(持有进入订单)
OrderProducts(订单和产品之间参见表格)

我有一个订单聚合根我想抽出一个简单订单的产品数量。

我的id,这将导致一个EF拉姆达迎接我的订单:

var order = _orderRepository.Get(orderId);  

然后,我尝试用拉的产品数的顺序:

var count = order.OrderProducts.Count(); 

此线路电抗器了当一个订单有A LOT一个记录,因为它正在提取所有这些记录。精细。 因此,我通过在我的订单内添加一些过滤器来计算产品,进行了一些改进。 产品有几个属性,其中包括一个类型(因此,有一个类型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!

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

回答

1

因为一旦你触摸导航属性(即order.OrderProducts),就会加载所有人,即加载所有人(即使是你不想要的)。你唯一的选择是减少这个数据库的数据库本身,并给出orderID。也许类似于:

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

我正在使用延迟加载,但是,我正在尝试其他内容。 – 2013-03-01 16:10:15

+1

但是,您提出的建议已经是我正在做的,我们已经通过将数据库中的数据量减少到一个数量更少的数字来解决它! ;) – 2013-03-04 12:47:43