如何先按ProcessId分组取最新状态,再按Status统计完成/失败数量?
解决思路与修正代码
核心逻辑拆解
要实现需求,需要分两步完成:
- 按ProcessId分组,提取每组最新状态:对每个ProcessId对应的所有任务,按
ProcessedTime降序排序,取第一条的Status(即最新处理记录的状态)。 - 统计各状态数量:将第一步得到的所有最新状态,按
Status分组统计Done和Failed的总数。
修正后的Linq代码
查询式写法(更直观)
// 第一步:获取每个ProcessId的最新状态 var latestStatusList = from js in context.JobSchedular where js.DepartmentId == 10 group js by js.ProcessId into processGroup // 每组按处理时间倒序,取第一条的状态 select processGroup.OrderByDescending(x => x.ProcessedTime).First().Status; // 第二步:统计Done和Failed的数量 var statistics = new StatisticsModel { Done = latestStatusList.Count(s => s == "Done"), Failed = latestStatusList.Count(s => s == "Failed") };
链式写法(更简洁)
var statistics = context.JobSchedular .Where(js => js.DepartmentId == 10) .GroupBy(js => js.ProcessId) .Select(group => group.OrderByDescending(x => x.ProcessedTime).First().Status) .Aggregate(new StatisticsModel(), (result, status) => { switch(status) { case "Done": result.Done++; break; case "Failed": result.Failed++; break; } return result; });
代码说明
group js by js.ProcessId into processGroup:正确按ProcessId分组,processGroup代表每个ProcessId对应的所有任务记录。OrderByDescending(x => x.ProcessedTime).First():对分组内的记录按处理时间倒序,取第一条即为最新处理的任务。- 后续通过
Count或Aggregate统计不同状态的数量,最终映射到StatisticsModel中。
内容的提问来源于stack exchange,提问作者I Love Stackoverflow
相关产品推荐
相关产品推荐

