返回父记录时有效获取子记录的计数

返回父记录时有效获取子记录的计数

问题描述:

我正在使用实体框架4.1使用代码优先方法。我有两个展现父母与子女关系的实体。为了提供一个具体的例子,假设我有一个Category实体,它有与之关联的零对多Product个实体。我已经设置了导航属性(在我的示例中,Category实体将具有ICollection<Product>属性,而Product实体具有Category属性)。返回父记录时有效获取子记录的计数

现在,当我得到Category个实体时,我还想要返回个数个子类别的子记录数。我知道我可以这样做:

Category category = dbContext.Categories.Single(...); 
int productCount = category.Products.Count(); 

但我担心,因为这被发送到数据库生成的SQL取决于我能否使用延迟或预先加载。

在第一种情况下(延迟加载),在调用Products集合提示EF运行SQL查询,如:

SELECT ... all columns ... 
FROM Products 
WHERE CategoryID = @CategoryID 

在第二种情况下(预先加载),该产品被加载时,类别信息被检索到,所以没有对数据库进行第二次查询,但缺点是如果我对产品不感兴趣(除了它们的计数),那么我会带回大量不需要的数据。

我希望它有两全其美:即只有一个数据库查询的能力和使用SELECT COUNT(*)的能力,而不是从表中获取所有列的能力。总之,我想SQL像下面这样被发送到数据库:

SELECT ... all category columns ..., 
     (SELECT COUNT(*) FROM Products p WHERE p.CategoryID = c.CategoryID) 
FROM Categories c 
WHERE c.CategoryID = ... 

是,在所有可能的EF或者是什么,我希望有一个白日梦?

不知道,但也许试试这个:

var result = db.Categories.Where(x => x.CategoryId == categoryId) 
          .Select(y => new 
           { 
           Count = y.Products.Count(), 
           Category = y 
           }) 
          .Single(); 

//result.Count 

//result.Category 

是的,这是可能的EF。您也可以创建一个视图模型来显示带有子计数属性的信息。本文将介绍如何做到这一点。

http://www.ozkary.com/2015/04/entity-framework-associated-table.html