如何将分组统计状态的SQL查询转换为LINQ查询?
解决方案
首先假设你的枚举定义如下(确保数值和SQL里的Status值完全对应):
public enum StatusEnum { Pending = 0, Approved = 1, Denied = 2 }
1. EF Core/LINQ to Entities(数据库端执行)
如果是用Entity Framework Core直接查询数据库,对应的LINQ查询完全对齐你的SQL逻辑:
var statusStats = dbContext.Client_BurnOuts // 按原始Status字段分组,和SQL的GROUP BY Status一致 .GroupBy(burnOut => burnOut.Status) .Select(group => new { // 转换Status值为对应文本,匹配SQL的CASE逻辑 Status = group.Key switch { 0 => "Pending", 1 => "Approved", 2 => "Denied", _ => "" }, // 统计每组数量,对应SQL的count(1) TotalCount = group.Count() }) .ToList();
如果想直接利用你定义的枚举避免硬编码字符串,可改成:
var statusStats = dbContext.Client_BurnOuts .GroupBy(burnOut => burnOut.Status) .Select(group => new { Status = Enum.IsDefined(typeof(StatusEnum), group.Key) ? Enum.GetName(typeof(StatusEnum), group.Key) : "", TotalCount = group.Count() }) .ToList();
2. LINQ to Objects(内存集合处理)
如果是处理内存中的Client_BurnOuts集合,写法类似,还能直接用枚举类型转换:
var statusStats = clientBurnOutsList .GroupBy(burnOut => burnOut.Status) .Select(group => new { Status = (StatusEnum?)group.Key switch { StatusEnum.Pending => nameof(StatusEnum.Pending), StatusEnum.Approved => nameof(StatusEnum.Approved), StatusEnum.Denied => nameof(StatusEnum.Denied), _ => "" }, TotalCount = group.Count() }) .ToList();
关键说明
- 分组逻辑严格对应SQL的
GROUP BY Status,均按原始数值型Status字段分组 - 文本转换完全匹配SQL的CASE分支,未定义的Status值返回空字符串
- 枚举写法可减少硬编码,提升代码可维护性,前提是枚举数值和数据库Status值完全对应
内容的提问来源于stack exchange,提问作者Mizanur Rahaman
相关产品推荐
相关产品推荐

