You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 13:54:04