如何用LINQ查询语法实现Group By后筛选符合条件的WorktypeWorkID
SQL转LINQ查询语法解决方法
你的目标SQL要实现的逻辑是:筛选出WorktypesWorksLevels表中,分组后最大LevelID不等于3的WorktypeWorkID,再用这些ID过滤主查询的数据。
你写的尝试代码有两个核心错误:
- 计算最大值时错误使用了
WorktypeWorkID,应该取LevelID的最大值 - 没完成
MaxLevelID !=3的筛选,也没提取出符合条件的ID集合来做Contains判断(对应SQL的IN)
正确的LINQ查询语法
假设主查询的实体表是MainTable,完整写法如下:
// 先获取符合条件的WorktypeWorkID集合 var validWorkIDs = from level in ctx.WorktypesWorksLevels group level by level.WorktypeWorkID into grouped let maxLevel = grouped.Max(l => l.LevelID) where maxLevel != 3 select grouped.Key; // 主查询用Contains实现SQL的IN逻辑 var queryResult = from item in ctx.MainTable where validWorkIDs.Contains(item.WorktypeWorkID) select item;
如果偏好链式语法,也可以写成:
var validWorkIDs = ctx.WorktypesWorksLevels .GroupBy(l => l.WorktypeWorkID) .Select(g => new { WorkID = g.Key, MaxLevel = g.Max(x => x.LevelID) }) .Where(p => p.MaxLevel != 3) .Select(p => p.WorkID); var queryResult = ctx.MainTable.Where(item => validWorkIDs.Contains(item.WorktypeWorkID));
关键点解释
- 先通过分组得到每个WorktypeWorkID对应的最高LevelID,筛选出最高级别不是3的ID
- 主查询中用
Contains方法对应SQL里的IN操作,完成最终过滤
内容的提问来源于stack exchange,提问作者markzzz
相关产品推荐
相关产品推荐

