返回父记录时有效获取子记录的计数
问题描述:
我正在使用实体框架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