【问题标题】:Convert SQL SUM CASE WHEN to Linq将 SQL SUM CASE WHEN 转换为 Linq
【发布时间】:2021-08-18 20:42:10
【问题描述】:

需要帮助在 c# 中将 sql 转换为 linq

  SELECT    SUM(CASE WHEN Evaluation.StatusId = 3 THEN 1 END)AS EvalutionOK,
        SUM(CASE WHEN Evaluation.StatusId = 4 THEN 1 END) AS EvalutionTodo, 
        SUM(CASE WHEN Evaluation.StatusId = 2 THEN 1 END) AS EvalutionNOk
FROM Investor   
INNER JOIN Evaluation ON Evaluation.InvestorId = [dbo].[Investor].Id  

Sql 结果:

评估OK 评估Todo 评估NOk 5 0 0

List<Investor> Investors = ObjectSet.Include(z =>z.Evaluation).ToList();

var test = from i in Investors 
                       select new TestModel
            { 
                EvalutionTodo = i.Evaluation.Sum(e => e.StatusId == 3? 1 : 0),
                EvalutionOK = i.Evaluation.Sum(e => e.StatusId == 4? 1 : 0),
                EvalutionNOk = i.Evaluation.Sum(e => e.StatusId == 2? 1 : 0),
 };

C# 结果:

TestModel的结果列表

评估OK 评估Todo 评估NOk 1 0 0

1 0 0

1 0 0

1 0 0

1 0 0

我错过了什么?有什么帮助吗?

谢谢

【问题讨论】:

  • from i in Investors -> 您正在迭代任何单个项目。

标签: c# sql linq sum case


【解决方案1】:

您可以通过常量值使用 GroupBy。这是由 LINQ 提供程序处理的特殊情况。

var query =
    from i in ObjectSet
    group i.Evaluation by 1 into g
    select new 
    {
        EvalutionOK = g.Sum(e => e.StatusId == 3 ? 1 : 0),
        EvalutionTodo = g.Sum(e => e.StatusId == 4 ? 1 : 0),
        EvalutionNOk = g.Sum(e => e.StatusId == 2 ? 1 : 0)
    };

【讨论】:

    【解决方案2】:

    您正在迭代单个元素,每次都替换旧值。

    尝试只求和一次:

    var test = new TestModel(){
        EvalutionTodo=0; EvalutionOK =0; EvalutionNOk =0;
    } 
    Investors.ForEach(i => {
        test.EvalutionTodo += i.Evaluation.Sum(e => e.StatusId == 3? 1 : 0);
        test.EvalutionOK += i.Evaluation.Sum(e => e.StatusId == 4? 1 : 0);
        test.EvalutionNOk += i.Evaluation.Sum(e => e.StatusId == 2? 1 : 0);
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多