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

如何通过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();

关键修改说明

  1. 分组后过滤:使用Where(g => !g.Any(row => row.ProcTyp == "DELETE"))检查每个分组,只要存在ProcTyp为DELETE的记录,就排除整个分组。
  2. 获取对应ProcTyp:通过OrderByDescending(row => row.ProcDate).First()定位分组内日期最新的记录,直接提取该记录的ProcTyp,满足结果格式要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 23:07:26