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

Linq新手求助:如何将含Group By的指定SQL查询转换为Linq

正确转换SQL到Linq的实现

首先明确原SQL的核心逻辑:筛选出同时关联了sID=123和sID=124的UserId——先过滤sID在目标范围内的数据,按UserId分组后,仅保留分组内不同sID数量等于2的组(即该UserId同时拥有两个目标sID)。

你的现有代码仅完成了筛选和去重,未实现分组与条件判断的核心逻辑,以下是正确实现:

方法语法(链式调用)

var targetSIDs = new List<int> { 123, 124 };
var result = obj_map.dbset
    .Where(x => targetSIDs.Contains(x.sID)) // 匹配sID在目标列表中的数据
    .GroupBy(x => x.UserId) // 按UserId分组
    .Where(g => g.Select(x => x.sID).Distinct().Count() == targetSIDs.Count) // 筛选分组内不同sID数量等于目标列表长度的组
    .Select(g => g.Key) // 提取分组对应的UserId
    .ToList();

查询语法(类SQL写法)

var targetSIDs = new List<int> { 123, 124 };
var result = (from item in obj_map.dbset
              where targetSIDs.Contains(item.sID)
              group item by item.UserId into userGroup
              where userGroup.Select(x => x.sID).Distinct().Count() == targetSIDs.Count
              select userGroup.Key).ToList();

关键细节说明

  • 定义targetSIDs列表替代硬编码,后续修改目标sID更灵活,也避免重复写固定值。
  • GroupBy(x => x.UserId)对应SQL的group by UserId,将相同UserId的记录聚合为一组。
  • Where(g => ...)对应SQL的having count(distinct sID) = 2,用targetSIDs.Count代替硬编码的2,扩展性更强。
  • 你的原代码中sID.Contains(x.sID.ToString())存在类型错误:如果sID是整数类型,无需转为字符串,直接用整数列表的Contains即可,避免不必要的类型转换和性能损耗。

内容的提问来源于stack exchange,提问作者cegano

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 21:10:39