在设置我的 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();
您可以在
.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();
逻辑实际上是“仅包括那些不有任何已删除成员的组”。