如何通过LINQ分组数据并排除含ProcTyp=DELETE记录的分组?
Lambda分组时排除包含特定字段值的分组
问题描述
需要按CTY和ProcId分组数据,获取每组的最大ProcDate,但要排除所有包含ProcTyp='DELETE'记录的分组(不是只过滤该记录,而是整个分组都剔除)。
原始数据
CTY ProcId ProcTyp ProcDate ZZZ 23-015 INIT 2023-01-26T20:04:30 ZZZ 23-015 UPDATE 2023-01-26T20:04:45 ZZZ 23-015 UPLOAD 2023-01-26T20:05:00 ZZZ 23-015 UPLOAD 2023-05-31T15:12:01 ZZZ 23-015 DELETE 2023-07-25T12:28:38 ZZZ 23-246 INIT 2023-11-07T23:31:09 ZZZ 23-246 DELETE 2023-11-08T16:49:55 ZZZ 23-248 INIT 2023-11-08T16:40:18 ZZZ 23-248 UPDATE 2023-11-08T16:43:14 ZZZ 23-248 UPLOAD 2023-11-08T16:43:35
期望结果
CTY ProcId ProcTyp MaxProcDate ZZZ 23-248 UPLOAD 2023-11-08T16:43:35
当前代码
var resListMax = resListAll .GroupBy(c => new { c.CTY, c.ProcId}) .Select(g => new { g.Key.CTY, g.Key.ProcId, MaxProcDate = g.Max(row => row.ProcDate), }) .OrderBy(x => x.CTY).ThenBy(x => x.ProcId) .ToList();
解决方法
需要在分组之后添加过滤条件排除含DELETE的分组;同时为了匹配期望结果中的ProcTyp字段,要找到分组内对应最大日期的完整记录,而非仅提取日期。
修改后的代码如下:
var resListMax = resListAll .GroupBy(c => new { c.CTY, c.ProcId }) // 过滤掉包含ProcTyp=DELETE的分组 .Where(g => !g.Any(row => row.ProcTyp == "DELETE")) .Select(g => { // 获取分组中ProcDate最新的记录 var latestRecord = g.OrderByDescending(row => row.ProcDate).First(); return new { g.Key.CTY, g.Key.ProcId, ProcTyp = latestRecord.ProcTyp, MaxProcDate = latestRecord.ProcDate }; }) .OrderBy(x => x.CTY).ThenBy(x => x.ProcId) .ToList();
关键修改说明
- 分组后过滤:使用
Where(g => !g.Any(row => row.ProcTyp == "DELETE"))检查每个分组,只要存在ProcTyp为DELETE的记录,就排除整个分组。 - 获取对应ProcTyp:通过
OrderByDescending(row => row.ProcDate).First()定位分组内日期最新的记录,直接提取该记录的ProcTyp,满足结果格式要求。
内容的提问来源于stack exchange,提问作者sinDizzy
相关产品推荐
相关产品推荐

