如何在LINQ中使用Group分组查询出现次数恰好为3的SuiteId
实现方案
你可以通过LINQ的GroupBy运算符按SuiteId分组后统计每组数量,筛选符合条件的分组即可实现需求,以下提供两种常用实现方式:
方式1:基于你已查询到的内存列表处理
如果你已经拿到了拉取到本地的SuiteId列表,直接对现有列表做分组过滤即可:
// 你原有的查询代码 var a = _context.SuiteReserveAvailables.Where(c => c.AvailableDate <= DtpEnd.SelectedDateTime && c.AvailableDate >= DtpStart.SelectedDateTime && c.ReserveStatus == false && c.IsDeleted == false && c.IsActive) .Select(c => c.SuiteId).ToList(); // 新增分组过滤逻辑 var targetSuiteIds = a.GroupBy(id => id) .Where(g => g.Count() == 3) .Select(g => g.Key) .ToList();
方式2:直接在数据库查询阶段完成过滤(性能更优)
不需要先把所有SuiteId拉取到本地,直接在EF查询链路中完成分组、筛选逻辑,可大幅减少不必要的数据传输,代码如下:
var targetSuiteIds = _context.SuiteReserveAvailables .Where(c => c.AvailableDate <= DtpEnd.SelectedDateTime && c.AvailableDate >= DtpStart.SelectedDateTime && c.ReserveStatus == false && c.IsDeleted == false && c.IsActive) .GroupBy(c => c.SuiteId) // 按SuiteId分组 .Where(g => g.Count() == 3) // 筛选出现次数恰好为3的分组 .Select(g => g.Key) // 取分组的Key即为符合要求的SuiteId .ToList();
效果验证
以你给出的示例数据{1,1,1,3,3,2,5,5,5,5}为例:
- 按SuiteId分组后,1对应的分组计数为3,3对应计数为2,2对应计数为1,5对应计数为4
- 筛选计数等于3的分组后,仅保留1对应的分组,最终得到的结果就是1,完全符合需求。
注意:方式2的分组逻辑可被EF Core等主流ORM框架正确翻译为SQL语句,直接在数据库侧执行,性能远高于先拉全量数据再本地处理的方式,优先推荐使用。
内容的提问来源于stack exchange,提问作者Rasool Aghajani
相关产品推荐
相关产品推荐

