Supponiamo di avere tre classi rappresentanti una ipotetica basi di dati "Università" (molto semplice). Una classe rappresentante lo studente, un classe rappresentante un esame sostenuto dallo studente ed una classe rappresentante l'associazione tra studenti ed esami sostenuti. Utilizzando un ClassDiagram avremmo qualcosa di simile a:
Supponiamo ora, di voler recuperare, una volta popolate le collezione di oggetti opportune, quali esami siano stati sostenuti dagli studenti e con quale votazione, utilizzando LINQ e l'operatore di Group By.
Possiamo scrivere del codice del tipo:
1 var queryEsamiSostenutiDaStudenti =
2 from s in studenti
3 join es in esamiSostenuti on s.ID_Studente equals es.ID_Studente
4 join esa in esami on es.ID_Esame equals esa.ID_Esame
5 select new { s.Cognome, s.Matricola, esa.Nome, esa.Descrizione, es.Voto, es.Lode };
6 //Esegue il GroupBy per cognome
7 var groupEsamiPerStudente =
8 from eSost in queryEsamiSostenutiDaStudenti
9 orderby eSost.Cognome ascending
10 group eSost by eSost.Cognome;
11 //Visualizza il risultato ottenuto
12 foreach (var groupEsamiStudente in groupEsamiPerStudente)
13 {
14 Console.WriteLine("----------------------------------------------------------");
15 Console.WriteLine("Lo studente {0} ha sostenuto i seguenti esami con profitto", groupEsamiStudente.Key);
16 foreach (var item in groupEsamiStudente)
17 {
18 Console.WriteLine("\t{0}, {1} {2} {3}", new object[]{
19 item.Nome , item.Descrizione ,
20 item.Voto,item.Lode ? "Con lode" : "Senza lode"}
21 );
22 }
23 Console.WriteLine("----------------------------------------------------------");
24 }
25
Utilizzando due cicli foreach riusciamo da ottenere un effetto del tipo:
Codice esempio
Technorati Tag:
LINQ,
Group By