如何使用EF Core在单次查询中同时获取最小值和最大值?
解决方案
可以通过分组聚合的方式将两次数据库访问合并为一次,EF Core会将其翻译成包含MIN和MAX的单条SQL语句,仅执行一次查询:
var stats = context.Posts .Where(...) // 保留你的原有筛选条件 .GroupBy(_ => 1) // 按常量分组,将所有符合条件的记录归为一组 .Select(g => new { MinStart = g.Min(p => p.Start), MaxEnd = g.Max(p => p.End) }) .FirstOrDefault(); // 使用结果 var min = stats?.MinStart; var max = stats?.MaxEnd;
说明
- 原代码中
Min()和Max()会分别触发一次数据库查询,因为每个聚合方法调用都会立即执行SQL。 - 按常量
1分组后,所有符合筛选条件的记录会被归为同一组,此时在分组内同时计算Min和Max,EF Core会生成一条包含两个聚合函数的SQL,仅访问一次数据库。 - 如果没有匹配的记录,
FirstOrDefault()会返回null,使用时需注意空值判断。
内容的提问来源于stack exchange,提问作者Alexander Blyth
相关产品推荐
相关产品推荐

