public static void Main()
var statuses = new []{ "Pending","ToDo","Done"};
var teams = new[]{"A Team","B Team","C Team"};
new { CurrentStatus = "Pending", TeamName = "A Team" },
new { CurrentStatus = "ToDo", TeamName = "B Team" },
new { CurrentStatus = "Done", TeamName = "B Team" },
new { CurrentStatus = "Done", TeamName = "C Team" },
new { CurrentStatus = "Done", TeamName = "C Team" },
new { CurrentStatus = "Done", TeamName = "A Team" },
new { CurrentStatus = "Done", TeamName = "A Team" },
new { CurrentStatus = "Done", TeamName = "A Team" },
new { CurrentStatus = "Done", TeamName = "A Team" }
var crossJoin = statuses.SelectMany(a=>teams.Select(b=> new { CurrentStatus = a , TeamName = b }));
var teamStatusCounts = models.GroupBy(x => new { x.CurrentStatus, x.TeamName })
.Select(g => new { g.Key, Count = g.Count() })
var emptyGroups = crossJoin.Where(a=>
!teamStatusCounts.Any(b=>
b.Key.CurrentStatus == a.CurrentStatus
&& b.Key.TeamName == a.TeamName))
Key = new { a.CurrentStatus, a.TeamName },
teamStatusCounts.AddRange(emptyGroups);
foreach(var value in teamStatusCounts.OrderBy(a=>a.Key.TeamName).ThenBy(a=>a.Key.CurrentStatus))
Console.WriteLine(value);