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