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

如何先按ProcessId分组取最新状态,再按Status统计完成/失败数量?

解决思路与修正代码

核心逻辑拆解

要实现需求,需要分两步完成:

  1. 按ProcessId分组,提取每组最新状态:对每个ProcessId对应的所有任务,按ProcessedTime降序排序,取第一条的Status(即最新处理记录的状态)。
  2. 统计各状态数量:将第一步得到的所有最新状态,按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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 03:01:08