使用SUM()将SQL语句转换为Linq/Entity Framework

Jam*_*esP 1 c# sql linq entity-framework-4

我试图弄清楚如何使用Linq将以下SQL语句转换为Entity Framework:

SELECT SUM(Column1) AS Correct
     , SUM(Column2) AS Incorrect
     , UserName
FROM   Stats 
WHERE (StatType = 0)
GROUP BY UserName
ORDER BY UserName 
Run Code Online (Sandbox Code Playgroud)

出于此问题的目的,DB中的所有列类型都是INT类型,每个用户有多行数据.我基本上在输出中需要3列,每个用户的选择总数正确和不正确.

这看起来像是一个简单的SQL语句,但无论我在LinqPad这样的东西中尝试过,我总是会遇到错误.我必须错过一些比较简单的东西.一旦我开始添加".Sum"子句,我就会遇到编译错误等.

Stats.Where(s => s.StatType == 0)
     .GroupBy(s => s.UserName)
     .Select(x => new {  Correct = x.Column1
                       , Incorrect = x.Column2
                       , User=x.UserName})
     .ToList()
Run Code Online (Sandbox Code Playgroud)

Dan*_*rth 6

以下应该做的伎俩:

Stats.Where(s => s.StatType == 0)
     .GroupBy(s => s.UserName)
     .Select(x => new { Correct = x.Sum(y => y.Column1),
                        Incorrect = x.Sum(y => y.Column2),
                        User = x.Key})
     .ToList();
Run Code Online (Sandbox Code Playgroud)

请注意GroupBy返回IEnumerable<IGrouping<TKey, TValues>>.
这意味着x内部Select是一个IGrouping<TKey, TValues>.反过来,它基本上只IEnumerable<T>包含该组的所有行以及该组的键.
因此,要获取组中所有项的总和,您需要Sum在分组上使用并指定要汇总的哪些列作为Sum方法的参数.