2013-10-31 7 views
7

Sto lavorando alla generazione di report per mostrare clienti utilizzando LINQ in C#. Voglio mostrare no. di clienti di ogni tipo.Linq Ottenere i clienti raggruppano per data e quindi per il loro tipo

Ci sono 3 tipi di clienti registrati, ospiti e manager. Voglio raggruppare per clienti per data di registrazione e quindi per tipo di cliente. Ad esempio, se oggi vengono inseriti 3 ospiti, 4 registrati e 2 manager. e domani 4,5 e 6 sono registrati risp. quindi il rapporto dovrebbe mostrare il numero di clienti registrati nel giorno. fila separata per ogni tipo.

DATE  TYPEOF CUSTOMER COUNT 
31-10-2013 GUEST    3 
31-10-2013 REGISTERED   4 
31-10-2013 MANAGER   2 
30-10-2013 GUEST    5 
30-10-2013 REGISTERED   10 
30-10-2013 MANAGER   3 

LIKE THIS.

var subquery = from eat in _customerRepo.Table 
          group eat by new { yy = eat.CreatedOnUTC.Value.Year, mm = eat.CreatedOnUTC.Value.Month, dd = eat.CreatedOnUTC.Value.Day } into g 
          select new { Id = g.Min(x => x.Id) }; 




var query = from c in _customerRepo.Table 
         join cin in subquery.Distinct() on c.Id equals cin.Id 
         select c; 

Con sopra interrogazione vengo cutomers minimi Registerd in quel giorno Grazie in anticipo

+0

'_customerRepo.Table.GroupBy (x => new {x.Date, x.Type});' e wi Li ho raggruppati da due proprietà – wudzik

risposta

16
var query = _customerRepo.Table 
    .GroupBy(c => new {Date = c.Date.Date, Type = c.TypeOfCustomer}) 
    .Select(g => new 
        { 
         Date = g.Key.Date, 
         Type = g.Key.Type, 
         Count = g.Count 
        } 
      ) 
    .OrderByDescending (r = r.Date); 
+0

+1 hamlet - pulito e esattamente come richiesto. buon uso delle 3 azioni. –

+2

@lazyberezovsky - non l'ho visto nella domanda OP come requisito, lemme guarda di nuovo :-). il mio male –

+0

e se volessi prendere ogni colonna dal tavolo !? –

1
var query = from c in _customerRepo.Table 
      group c by new { c.TypeOfCustomer, c.Date } into g 
      orderby g.Key.Date descending, 
        g.Key.TypeOfCustomer == "GUEST" ? 1 : 
        g.Key.TypeOfCustomer == "REGISTERED" ? 2 : 3 
      select new { 
       g.Key.Date, 
       g.Key.TypeOfCustomer, 
       Count = g.Count() 
      }; 

È possibile rimuovere secondo ordine, se non è richiesto per i risultati giorno per essere in guest ordine> registrati> Manager :

var query = from c in _customerRepo.Table 
      group c by new { c.TypeOfCustomer, c.Date } into g 
      orderby g.Key.Date descending 
      select new { 
       g.Key.Date, 
       g.Key.TypeOfCustomer, 
       Count = g.Count() 
      }; 
+0

Funziona, ma ora cosa succede se voglio prendere ogni colonna dal tavolo !? –

+0

@Nitinvarpe è possibile selezionare solo chiavi di raggruppamento e valori aggregati. –

+0

Non c'è alcuna soluzione a questo, per selezionare tutte le colonne, ad esempio il loro numero di telefono, indirizzo, email? –

Problemi correlati