Linq to SQL:使用GroupBy()和Max()获取目标数据集
问题描述
现有一张数据表,表结构包含Status(状态)与Category(分类)字段,需求为:
- 按
Status分组,获取每组中Category为最大值的所有行 - 特殊场景处理:
- 当
Status为'1'时,最大Category是2,需获取该Category对应的所有行 - 当
Status为'2'时,最大Category是null,需获取该分组下所有Category为null的行
- 当
此前尝试的Linq代码仅能得到每组的Status与对应最大Category值,无法获取完整行数据,代码如下:
var tableData = (from d in x.Data group d by d.Status into grp select new { Status = grp.Key, Category = grp.Max(d => d.Category) }).ToList();
正确Linq查询实现
方案一:查询语法嵌套
先分组计算每组的最大Category(自动处理全为null时返回null的场景),再关联原表筛选符合条件的行:
var result = from d in x.Data join groupMax in ( from item in x.Data group item by item.Status into grp select new { Status = grp.Key, MaxCategory = grp.Max(i => i.Category) } ) on d.Status equals groupMax.Status where (groupMax.MaxCategory == null && d.Category == null) || d.Category == groupMax.MaxCategory select d;
方案二:链式方法语法
逻辑与方案一致,用链式写法更简洁:
// 先获取每组的Status和对应最大Category var groupMaxValues = x.Data .GroupBy(d => d.Status) .Select(grp => new { Status = grp.Key, MaxCategory = grp.Max(d => d.Category) }); // 关联原表筛选目标行 var result = x.Data .Join(groupMaxValues, data => data.Status, max => max.Status, (data, max) => new { DataRow = data, TargetCategory = max.MaxCategory }) .Where(pair => (pair.TargetCategory == null && pair.DataRow.Category == null) || pair.DataRow.Category == pair.TargetCategory) .Select(pair => pair.DataRow);
核心说明
- 原代码的问题:仅返回了分组聚合后的元数据,未关联原表提取完整行记录
- null值处理:当分组的最大
Category为null时,自动筛选该分组下所有Category为null的行;否则筛选Category等于最大值的行 - 若使用EF Core等ORM框架,该写法会被转换为高效的SQL查询,无需担心内存处理性能问题
内容的提问来源于stack exchange,提问作者Developer
相关产品推荐
相关产品推荐

