EF Core查询月度统计仅返回有数据月份 如何补全全年月份无数据值为0
实现方案
核心思路
- 原有EF Core分组查询仅会返回数据库中存在匹配数据的月份,因此需要额外构造1-12月的完整基准集合,和查询结果合并补全缺失月份
- 数据查询逻辑优先在数据库侧执行,内存侧仅做补全月份的轻量操作,不影响查询性能
调整后代码
// 第一步:查询数据库中存在数据的月份统计结果 var existMonthStats = context.Bids .Where(b => b.UID == UID && (b.Status == MyStatus.Awarded || b.Status == MyStatus.Completed) // 若需要统计指定年份,可放开下方注释,替换为目标年份 // && b.InsertedDate.Year == 2024 ) .GroupBy(a => a.InsertedDate.Month) .Select(g => new MyServiceList { Key = g.Key.ToString(), Month = g.Key.ToString(), Total = g.Sum(s => s.totalBudget) }) .ToList(); // 第二步:补全全年12个月数据,无数据月份Total默认赋值为0 var fullYearStats = Enumerable.Range(1, 12) .Select(month => existMonthStats.FirstOrDefault(item => item.Month == month.ToString()) ?? new MyServiceList { Key = month.ToString(), Month = month.ToString(), Total = 0 }) .OrderBy(item => int.Parse(item.Month)) .ToList();
优化提示
你原有代码中的Include(r => r.AllRequest).ThenInclude(r => r.Category)没有必要,你的整个分组查询未用到关联实体的任何属性,删除后可以减少不必要的表关联,提升查询性能。
内容的提问来源于stack exchange,提问作者codeman
相关产品推荐
相关产品推荐

