如何解决将 SQL SUM CASE WHEN 转换为 Linq
需要帮助在 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
查询结果:
EvalutionOK EvalutionTodo EvalutionNOk 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 的结果列表
EvalutionOK EvalutionTodo EvalutionNOk 1 0 0
1 0 0
1 0 0
1 0 0
1 0 0
我错过了什么?有什么帮助吗?
谢谢
解决方法
您可以通过常量值使用 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)
};
,
您正在迭代单个元素,每次替换旧值。
只尝试一次求和:
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);
});
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。