2016-08-11 18 views
5

Mam tabelę o polach TeamName i CurrentStatus. Robię kwerendy LINQ, aby uzyskać dla każdego zespołu i dla każdego stanu zliczania rekordów:Uwzględnij count = 0 w wynikach linq

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

Wyniki tego zapytania zwraca wszystkie liczniki wyjątkiem sytuacji, gdy liczba 0. Muszę wiersze tam, gdzie nie jest rekordem dla konkretnego zespołu i określonego statusu (gdzie liczba = 0).

+6

Cóż, nie można utworzyć wiersze z powietrza. Być może masz osobny stolik ze wszystkimi wymienionymi zespołami. Jeśli tak, musisz wykonać lewe sprzężenie między obiema tabelami. EDYCJA: W zależności od wymagań może być również konieczne dołączenie do tabeli zawierającej wszystkie możliwe statusy. – sstan

+1

Prawdopodobnie stworzyłeś model, wewnętrznie dołączając do swojej tabeli statusu i swoich zespołów, prawda? wtedy stracisz wszystkie dane statusu w tabeli wyników. możesz albo zmienić go na lewe połączenie, albo dodać puste wiersze na końcu –

+1

Naiwny, coś jak 'var teamStatusCounts = allPossibleStatusAndTeamCombinations.Select (x => nowy {Key = x, Count = models.Count (y => y.CurrentStatus == x.CurrentStatus && y.TeamName == x.TeamName),}); '. –

Odpowiedz

2

Można mieć osobną kolekcję dla nazwy zespołu i Statusy oczekujesz i dodać brakujące te do wyniku ustawić

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

To jest dokładnie to, czego potrzebowałem !! dzięki – Hanady

0

chciałbym wybrać nazwy zespołu i statusu pierwszy:

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

Możesz tego pominąć, jeśli znasz już wpisy na liście.

Następnie można wybrać dla każdej drużyny i każdy stan liczba modeli:

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

To nie działa, jeśli na 'modelach 'brakuje nazw zespołów i statusów, co jest problemem OP. – sstan

+0

@sstan Myślę, że masz rację. Źle zrozumiałem pytanie. Pomyślałem, że zawsze jest każda nazwa drużyny i każdy stan przynajmniej raz w "modelach". – Koopakiller