我正在使用 Entity Framework 4.1 使用 Code First 方法。我有两个表现出父子关系的实体。举一个具体的例子,假设我有一个 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
关于sql - 返回父记录时有效地获取子记录的计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8335310/