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

时间:2011-12-01 01:01:09

标签: sql entity-framework

我使用Code First方法使用Entity Framework 4.1。我有两个展示父子关系的实体。为了提供一个具体的例子,假设我有一个Category实体,它与之关联的零到多Product个实体。我在双方都设置了导航属性(在我的示例中,Category实体将具有ICollection<Product>属性,而Product实体具有Category属性)。

现在,当我获得Category个实体时,我还希望获得每个类别的子记录数量的 count 。我知道我能做到:

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来说是完全可能还是我想做个梦想?

2 个答案:

答案 0 :(得分:5)

不确定,但也许可以试试这个:

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

//result.Count

//result.Category

答案 1 :(得分:0)

是的,这可以通过EF实现。您还可以创建视图模型,以将子计数显示为属性。本文介绍了如何做到这一点。

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

相关问题