2016-08-11 47 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