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
相关产品推荐
相关产品推荐

