繁体   English   中英

在linq结果中包括count = 0

[英]Include count = 0 in linq results

我有一个TeamNameCurrentStatus字段的表。 我正在制作一个linq查询来获取每个团队以及每个状态的记录数量:

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

此查询的结果返回除count为0之外的所有计数。我需要获取没有特定团队记录和特定状态(其中count = 0)的行。

您可以为您期望的团队名称和状态设置单独的集合,并将缺少的集合添加到结果集中

//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);

我创造了一个小提琴,展示了答案

我会首先选择球队名称和状态:

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)
    }));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM