1

我试图弄清楚如何使用 Linq 将以下 SQL 语句转换为实体框架:

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

对于这个问题,数据库中的所有列类型都是 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()
4

1 回答 1

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();

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

于 2012-10-22T20:53:51.243 回答