2012-10-22 144 views
1

我試圖弄清楚如何使用LINQ下面的SQL語句轉換爲實體框架轉換SQL語句:使用SUM()到LINQ /實體框架

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

回答

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>>
這意味着Select中的xIGrouping<TKey, TValues>。這反過來基本上只是一個IEnumerable<T>,其中包含該組的所有行以及該組的鍵。
因此,要獲得組中所有項目的總和,您需要在分組上使用Sum,並指定將哪些列作爲Sum方法的參數進行求和。