使用LINQ Group By计算任务执行状态统计数据的技术咨询
使用LINQ Group By实现任务状态统计
没问题,我来帮你搞定这个成功/失败的统计需求~
首先明确关联逻辑:MyProgress通过JobId字段关联Job表,我们需要基于Job的StateName来分组统计对应的MyProgress记录数。
场景1:数据库查询(EF Core)
假设你已经有对应的DbContext,包含MyProgresses和Jobs两个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




