You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将分组统计状态的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 08:25:37