2016-08-11 69 views
5

我有一個表有TeamNameCurrentStatus字段。我想提出一個LINQ查詢以獲得每個團隊和每個狀態的記錄數:linq結果中包含count = 0

var teamStatusCounts = models.GroupBy(x => new { x.CurrentStatus, x.TeamName }) 
          .Select(g => new { g.Key, Count = g.Count() }); 

該查詢返回的結果,除非計數爲0。我需要得到各行的種種罪狀那裏對特定團隊和特定狀態(其中count = 0)沒有記錄。

+6

嗯,你不能創建行憑空。也許你有一個單獨的表格列出所有的球隊。如果是這樣,您需要在兩個表之間執行左連接。編輯:並根據您的要求,它可能也是,你需要加入一個包含所有可能的狀態的表。 – sstan

+1

你可能已經創建了內部加入你的狀態表和你的團隊的模型嗎?那麼你將失去結果表中的所有狀態數據。你可以將它改爲左連接,或者在末尾添加空行 –

+1

天真,就像'var teamStatusCounts = allPossibleStatusAndTeamCombinations.Select(x => new {Key = x,Count = models.Count(y => y.CurrentStatus == x.CurrentStatus && y.TeamName == x.TeamName),});'。 –

回答

2

你可以爲球隊名稱的單獨收集和狀態,你期待和缺少的添加到結果集

//assuming allTeamNamesAndStatuses is a cross joing of all 'CurrentStatus' and 'TeamNames' 
var teamStatusCounts = models.GroupBy(x => new { x.CurrentStatus, x.TeamName }) 
          .Select(g => new { g.Key, Count = g.Count() }) 
          .ToList(); 

var missingTeamsAndStatuses = allTeamNamesAndStatuses 
        .Where(a=> 
         !teamStatusCounts.Any(b=> 
          b.Key.CurrentStatus == a.CurrentStatus 
          && b.Key.TeamName == a.TeamName)) 
        .Select(a=>new { 
         Key = new { a.CurrentStatus, a.TeamName }, 
         Count = 0 
        }); 

teamStatusCounts.AddRange(emptyGroups); 

I've created a fiddle demonstrating the answer as well

+0

這正是我需要的!謝謝 – Hanady

0

我會首先選擇球隊的名字和狀態:

var teams = models.Select(x => x.TeamName).Distinct().ToList(); 
var status = models.Select(x => x.CurrentStatus).Distinct().ToList(); 

如果您已經知道列表條目,則可以跳過此操作。

然後你可以選擇每個團隊和每個國家的車型數量:

var teamStatusCounts = teams.SelectMany(team => states.Select(state => 
    new 
    { 
     TeamName = team, 
     CurrentStatus = state, 
     Count = models.Count(model => 
        model.TeamName == team && model.CurrentStatus == state) 
    })); 
+0

如果'models'缺少開始的團隊名稱和狀態,這是OP的問題,這是行不通的。 – sstan

+0

@sstan我認爲你是對的。我誤解了這個問題。我認爲每個球隊的名字和每個狀態至少有一次在'模型'中。 – Koopakiller