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

标签 sql entity-framework

我正在使用 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/

相关文章:

c# - 使用 LINQ 获取一个具有大部分子实体的实体

mysql - 带小数点的货币求和[MYSQL]

python - 在 Django 的 ORM 中访问存储过程的最佳方法是什么

mysql - SQL 仅选择列上具有最大值的行

asp.net - 扩展 ASP.NET Identity 2.0

.net - 来自线程的 Entity Framework 连接管理

java - HQL 或 Criteria 中的 CASE 语句

php - MySQL 查询出错?

linq - 将 DefaultExpression 绑定(bind)到 Linq-to-Entities 查询中的属性

.net - 使用 Entity Framework 在运行时更新数据库架构