You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用LINQ Group By计算任务执行状态统计数据的技术咨询

使用LINQ Group By实现任务状态统计

没问题,我来帮你搞定这个成功/失败的统计需求~

首先明确关联逻辑:MyProgress通过JobId字段关联Job表,我们需要基于JobStateName来分组统计对应的MyProgress记录数。

场景1:数据库查询(EF Core)

假设你已经有对应的DbContext,包含MyProgressesJobs两个DbSet,关键是通过Join关联两张表,再用GroupBy按状态分组统计,最终提取每个分组的记录数:

var statusStats = await _context.MyProgresses
    // 关联MyProgress和Job表,匹配JobId
    .Join(_context.Jobs,
          progress => progress.JobId,
          job => job.Id,
          (progress, job) => new { Progress = progress, Job = job })
    // 按Job的状态名称分组
    .GroupBy(joined => joined.Job.StateName)
    // 提取统计结果:状态名称 + 对应记录数
    .Select(group => new
    {
        State = group.Key,
        Count = group.Count()
    })
    .ToListAsync();

这段代码执行后,会返回符合你需求的结果:

[
    { State = "Failed", Count = 10 },
    { State = "Succeeded", Count = 10 }
]

场景2:内存集合统计

如果你的数据已经在内存列表中,代码逻辑类似,只是不需要异步操作:

// 模拟你的数据集合
var myProgresses = new List<MyProgress>(); // 这里填充你的10条成功、10条失败对应的记录
var jobs = new List<Job>
{
    new Job { Id = 1, StateName = "Failed" },
    new Job { Id = 2, StateName = "Succeeded" }
};

var statusStats = myProgresses
    .Join(jobs,
          p => p.JobId,
          j => j.Id,
          (p, j) => new { Progress = p, Job = j })
    .GroupBy(joined => joined.Job.StateName)
    .Select(group => new
    {
        State = group.Key,
        Count = group.Count()
    })
    .ToList();

进阶:确保所有状态都被统计(含无数据状态)

如果需要即使某个状态没有对应的MyProgress记录,也能显示Count = 0的统计结果,可以用GroupJoin实现左连接,保留所有Job状态:

var statusStats = await _context.Jobs
    // 左连接Job和MyProgress,保留所有Job记录
    .GroupJoin(_context.MyProgresses,
               job => job.Id,
               progress => progress.JobId,
               (job, relatedProgresses) => new
               {
                   State = job.StateName,
                   Count = relatedProgresses.Count()
               })
    .ToListAsync();

内容的提问来源于stack exchange,提问作者I Love Stackoverflow

火山引擎 最新活动