Sco*_*ell 4 sql entity-framework
我使用Code First方法使用Entity Framework 4.1.我有两个展示父子关系的实体.为了提供一个具体的例子,假设我有一个与它相关的Category零到多Product实体的实体.我已在两侧设置导航属性(在我的示例中,Category实体将具有ICollection<Product>属性,而Product实体具有Category属性).
现在,当我得到Category实体我也想找回一个计数的孩子记录每个类别的数量.我知道我能做到:
Category category = dbContext.Categories.Single(...);
int productCount = category.Products.Count();
Run Code Online (Sandbox Code Playgroud)
但我很担心因为发送到数据库的结果SQL取决于我是使用延迟还是急切加载.
在第一种情况下(延迟加载),对Products集合的调用会提示EF运行SQL查询,如:
SELECT ... all columns ...
FROM Products
WHERE CategoryID = @CategoryID
Run Code Online (Sandbox Code Playgroud)
在第二种情况下(急切加载),在检索类别信息时加载产品,因此没有对数据库的第二次查询,但缺点是,如果我对产品一无所知(除了计数)然后我带回了很多不需要的数据.
我希望它拥有两个世界中最好的东西:即,只有一个数据库查询的能力和一个使用SELECT COUNT(*)而不是一个从表中获取所有列的能力.简而言之,我希望将以下SQL发送到数据库:
SELECT ... all category columns ...,
(SELECT COUNT(*) FROM Products p WHERE p.CategoryID = c.CategoryID)
FROM Categories c
WHERE c.CategoryID = ...
Run Code Online (Sandbox Code Playgroud)
是不是所有可能与EF或我想要一个梦想?
不确定,但也许试试这个:
var result = db.Categories.Where(x => x.CategoryId == categoryId)
.Select(y => new
{
Count = y.Products.Count(),
Category = y
})
.Single();
//result.Count
//result.Category
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2409 次 |
| 最近记录: |