LINQ 对列表进行分组并排除包含带有字段值的记录的组

问题描述 投票:0回答:1

在设置我的 lamda 时遇到问题,以排除具有包含值的字段的记录的组。我的数据示例:

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 分组,然后获取 MAX ProcDate。但是,那些具有 1 个或多个 ProcTyp = 'DELETE' 的组必须从分组中省略。我不仅想过滤掉这些记录,还想过滤掉拥有这些记录的组。在这种情况下,结果应该是一个列表:

CTY ProcId ProcTyp MaxProcDate 
ZZZ 23-248 UPLOAD  2023-11-08T16:43:35

我当前的 C# 代码:

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();

我一直在查看示例,但只是不知道应该将组过滤放在哪里?我觉得这个post是我想要的,但不知道如何实现。任何帮助表示赞赏。

编辑:根据建议,我将代码更新为:

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),
                    NumDeletes = g.Count(x => x.ProcTyp == "XWT.DELETE")
                })
                .Where(x => x.NumDeletes <= 0)
                .OrderBy(x => x.CTY).ThenBy(x => x.ProcId)
                .ToList();
c# linq filter lambda grouping
1个回答
1
投票

您可以在

.Where()
之后立即添加
.GroupBy()
过滤器,用于检查并排除包含 any“已删除”成员的组。

var resListMax = resListAll
                .GroupBy(c => new { c.CTY, c.ProcId})
                .Where(g => !g.Any(x => x.ProcTyp == "XWT.DELETE"))
                .Select(g => new
                {
                    g.Key.CTY,
                    g.Key.ProcId,
                    MaxProcDate = g.Max(row => row.ProcDate),
                })
                .OrderBy(x => x.CTY).ThenBy(x => x.ProcId)
                .ToList();

逻辑实际上是“仅包括那些有任何已删除成员的组”。

© www.soinside.com 2019 - 2024. All rights reserved.