如何修正LINQ GroupBy语句实现工作天数多阈值人数统计
员工考勤LINQ统计逻辑修复
基础数据说明
现有考勤记录集合items存储员工出勤数据,包含2个字段:
name:员工姓名date:对应工作日期
原始考勤明细:
- 员工a:出勤日期为2022-3-5、2022-3-6、2022-3-7
- 员工b:出勤日期为2022-3-6、2022-3-7
- 员工c:出勤日期为2022-3-7
统计需求
需生成两类统计报表:
- 人员出勤明细表:统计每位员工的累计工作天数,预期结果为a工作3天、b工作2天、c工作1天
- 汇总统计报表:依次统计5项指标,预期结果为:出勤≥3天人数1、出勤≥2天人数2、出勤≥1天人数3、总人数3、总工作天数3
原有代码问题
原有代码错误使用date作为分组键,实际统计的是「满足出勤人数阈值的日期数量」,和需求要求的「按员工维度统计出勤天数后,计算满足阈值的员工数量」逻辑完全不符,错误代码如下:
int count1 = items.GroupBy(g => g.date).Where(w => w.Count() >= 3).Count(); int count2 = items.GroupBy(g => g.date).Where(w => w.Count() >= 2).Count(); int count3 = items.GroupBy(g => g.date).Where(w => w.Count() >= 1).Count();
修复后实现
核心修正点:将分组键从date改为员工唯一标识name,先完成单员工出勤天数的基础统计,再基于该中间结果生成两类报表,避免重复计算。
// 第一步:按员工分组,计算单员工累计出勤天数,作为所有统计的基础数据源 var userAttendance = items .GroupBy(g => g.name) .Select(g => new { UserName = g.Key, WorkDays = g.Count() }) .ToList(); // 汇总统计报表指标计算 int count1 = userAttendance.Count(x => x.WorkDays >= 3); // 出勤≥3天人数,结果1 int count2 = userAttendance.Count(x => x.WorkDays >= 2); // 出勤≥2天人数,结果2 int count3 = userAttendance.Count(x => x.WorkDays >= 1); // 出勤≥1天人数,结果3 int totalUser = userAttendance.Count; // 总员工人数,结果3 int totalWorkDays = items.Select(x => x.date).Distinct().Count(); // 有出勤记录的总日期数,结果3,匹配预期 // 人员出勤明细表:直接遍历userAttendance即可输出每位员工的累计工作天数
注:如果业务定义的「总工作天数」为全员累计出勤人天,将
totalWorkDays的计算逻辑改为userAttendance.Sum(x => x.WorkDays)即可,该场景下计算结果为6。
内容的提问来源于stack exchange,提问作者jun chen
相关产品推荐
相关产品推荐

