能否在单次遍历中统计分组内满足/不满足谓词的项?优化EF查询
解决方案
当然可以简化,而且能保证查询全程在服务器端执行(EF Core/EF能正确将逻辑翻译为SQL,不会把分组数据拉到本地计算)。
核心思路是利用Sum结合条件判断,把符合/不符合条件的项分别计数,再通过分组总数量推导另一个计数,避免两次遍历分组:
var x = from c in _context [...] group subResult by subResult.Id into g let count1 = g.Sum(item => predicate(item) ? 1 : 0) select new { g.Key, Count1 = count1, Count2 = g.Count() - count1 };
为什么这样可行?
- EF能把
Sum(CASE WHEN ... THEN 1 ELSE 0 END)的逻辑直接翻译为SQL,所有计算都在数据库端完成,不会拉取分组数据到本地。 - 相比原来两次
Where+Count,这种方式只需要对分组数据做一次条件判断,生成的SQL更高效,减少数据库的计算开销。
只要你的predicate是EF可翻译的表达式(比如直接基于实体属性的条件,不是本地自定义方法),这个方案完全适用。
内容的提问来源于stack exchange,提问作者Yoda
相关产品推荐
相关产品推荐

