1

Linqを使用して次のSQLステートメントをEntityFrameworkに変換する方法を理解しようとしています。

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

この質問の目的上、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()
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 に答える