2014-05-12 82 views
1

下面我有一個SQL查詢:SQL中的LINQ語句,包括GROUP BY和順序按

SELECT DISTINCT 
    Table1.Description, 
    Table2.AccountId, 
    COUNT(Table2.AccountId) AS Charges 
FROM Table2 
LEFT JOIN Table1 ON Table2.AccountId = Table1.Id 
WHERE Table2.DateTime > '3/1/2014' 
    AND Table2.DateTime < '4/1/2014' 
GROUP BY Table2.AccountId, Table1.Description 
ORDER BY Charges DESC 

我試圖將其轉換爲在ASPX.CS代碼LINQ查詢後面填充一個表,並使用圖表中的數據。

我有這麼遠低於爲:

var resultList = configDB.Table2 
    .Where(x => x.DateTime > begDate && x.DateTime < endDate) 
    .GroupBy(x => x.AccountID) 
    .Select(g => new { Account = g.Key, Charges = g.Count() }) 
    .OrderByDescending(g => g.Charges) 
    .ToList(); 

這只是表2部分。我也想加入表1,並且仍然可以計算出我無法獲得的代碼。我發現了幾個帖子和解決方案,可以單獨完成每個帖子,但沒有一個答案,他們在分組和加入的同時獲得一列的數量。任何人都可以指導我使用一種能夠幫助或指向正確方向的資源嗎?

+0

你曾經通過查詢語法嘗試過嗎? –

+2

當我看到'SELECT DISTINCT'時,我立即知道有什麼不對。獨特之處在這裏是多餘的。 – usr

+0

我不確定問題是什麼。只需在Where之前加入Table1即可。這不行嗎?這給了你Table1,Table2和Table1可能爲null的配對。查詢的其餘部分可以使用這些對。 – usr

回答

1

我想出了這個(可能需要一些調整)

var resultList = Table2 
      .Where(x => x.DateTime > begDate && x.DateTime < endDate) 
      .Join(Table1, t2 => t2.AccountId, t1 => t1.Id, 
       (t2, t1) => new { t2.AccountId, t1.Description }) 
      .GroupBy(x => x.AccountId) 
      .Select(g => new { Group = g, Charges = g.Count() }) 
      .OrderByDescending(g => g.Charges) 
      .SelectMany(g => g.Group.Select(x => new { x.Description, x.AccountId, g.Charges })) 
      .ToList(); 
+0

我認爲這將做一個內部連接,而不是一個左連接。 –

+0

如果我選擇SelectMany而不是SelectMany,它會給我一個計數清單,這是正確的收費計數,然後如果你擴展它,那是它的名字,accountId和收費。因此,例如,頂級條目20,000條目,所以它表示20000的計數,並且當我擴展時,它是描述,帳戶,收費的20,000條目。使用SelectMany它看起來是正確的,但看起來像需要一個SELECT DISTINCT,因爲每個Description有幾個條目具有相同的信息。 – Justin

+0

好吧,這樣做Select而不是SelectMany並且在該行的末尾添加FirstOrDefault()給了我想要的結果。再次感謝您的輸入。 – Justin

0

嘗試這樣:

var resultList = configDB.Table2 
         .Where(x => x.DateTime > begDate && x.DateTime < endDate) 
         .GroupJoin(configDB.Table1, 
            t2 => t2.AccountId, 
            t1 => t1.Id, 
            (t2, joined) => new 
            { 
             Description = joined.Select(t => t.Description).FirstOrDefault(), 
             AccountID = t2.AccountId, 
            }) 
         .GroupBy(x => x.AccountID) 
         .Select(g => new 
         { 
          Account = g.Key, 
          Charges = g.Count(), 
          Description = g.Select(d=>d.Description).FirstOrDefault() 
         }) 
         .OrderByDescending(g => g.Charges) 
         .ToList(); 
+0

謝謝你的迴應。我相信這與我正在努力完成的事情很接近。看起來我得到的結果集有很多重複條目,其費用值爲1.我在原始查詢中做的是Table2中AccountId條目的計數。雖然如果我嘗試t2.Count()而不是Joined.Count(),但它不起作用。爲什麼它不能對t2進行計數,還是有另一種方法來做到這一點? 「加入」是 – Justin

+1

是左側加入語句的右側。它是Id = AccountId的條目集合。我剛剛更新了我的答案,請嘗試新版本。 –

+0

運行編輯後的代碼後,出現以下錯誤:「DbLimitExpression需要集合參數。\ r \ nParameter name:argument」,我正在研究查看是什麼導致了這種情況。 – Justin