LINQ To Objects
Come detto in precedenza, utilizzando LINQ si possono eseguire query verso una struttura di oggetti. Per dimostrare la potenza di questa tecnologia si pensi ad una lista di oggetti di tipo Persona.
public class Persona{
public string Nome { get; set; }
public string Cognome { get; set; }
public int Eta { get; set; }
public string Citta { get; set; }
}Notare la sintassi semplificata delle proprietà che sfrutta le automatic properties.
Si supponga di voler ricercare tutte le persone che abbiano compiuto la maggiore età.
List<Persona> persone = new List<Persona> {
new Persona { Nome="Stefano", Cognome="Mostarda", Eta=14, Citta="Roma"},
new Persona { Nome="Riccardo", Cognome="Golia", Eta=35, Citta="Padova"},
new Persona { Nome="Cristian", Cognome="Civera", Eta=25, Citta="Brescia"},
new Persona { Nome="Christian", Cognome="Paparelli", Eta=31, Citta="Roma"},
};
var result = from p in persone
where p.Eta > 17
select p;
GridView1.DataSource = result;
GridView1.DataBind();Come si può osservare dal codice, sono state utilizzate alcune feature del .NET Framework 3.5 come gli Array e gli Object Initializers. Anche se non fanno parte delle novità introdotte appositamente per supportare LINQ, questo è un esempio di come rendano comumque il codice più semplice da scrivere.
La parte interessante viene nella seconda meta dello snippet dove entra in azione LINQ. Come si può notare la sintassi è molto simile a quella SQL, il che rende la vita molto semplice sia a coloro che hanno confidenza principalmente con codice C# o VB, sia a coloro che invece hanno conoscenze prettamente del mondo SQL. Tutto ciò rende la sintassi LINQ di facile comprensione per tutti.
In particolare, lo snippet ricerca tra gli elementi della lista di persone (from p in persone) tutti quelli che hanno la proprietà Eta maggiore di 17 anni (where p.Eta >= 18). Dopo aver effettuato la ricerca, tutti gli elementi trovati vengono depositati nella variabile result che, a questo punto, può essere collegata ad una gridview per mostrare il risultato.
In questo caso, l'uso della Type Inference per definire il tipo ottenuto dalla query (result) non è strettamente necessarrio in quanto il tipo di oggetto estratto è sicuramente una lista di oggetti Persona. Quindi la seguente sintassi produrrebbe lo stesso effetto della precedente:
IEnumerable<Persona> result = from p in persone...Questo però non è sempre vero; molto spesso capita di dover estrarre solamente alcuni dati dell'oggetto che si sta ricercando, ad esempio solo cognome ed età. In questo caso tornano utili gli Anonymous Types per generare come risultato una lista di oggetti diversi da quelli che si stanno ricercando.
var result = from p in persone
where p.Eta > 30
select new { Cognome = p.Cognome, Eta = p.Eta};
GridView1.DataSource = result;
GridView1.DataBind();In questo snippet il risultato della query è una lista di oggetti il cui nome viene definito dal compilatore e quindi non è determinabile via codice. Ne consegue che dichiarare esplicitamente il tipo della variabile result non è possibile e quindi si deve obbligatoriamente ricorrere alla parola chiave var e alla Type Inference (implicita) per ottenere la lista tipizzata.
E' da sottolineare che durante tutto questo processo, Visual Studio offre sempre l'autocompletion sia per la costruzione delle query, sia per le classi generate dinamicamente dal compilatore.


Così come per le operazioni di ricerca, LINQ offre anche soluzioni per ordinare e raggruppare i dati. Sfruttando la clausola orderby, si può ordinare una lista in base al valore di una proprietà degli oggetti in essa contenuti.
var result = from p in persone
orderby p.Eta
select p;
GridView1.DataSource = result;
GridView1.DataBind();Lo snippet precedente ordina le persone in base all'eta; ovviamente, esistono gli operatori ascending e descending per decidere il tipo di ordinamento.
var result = from p in persone
group p by p.Citta into g
select new { Citta = g.Key, Totale = g.Count() };Questo statement raggruppa le persone in base alla città e restituisce una lista di classi anonime che contengono il nome della città ed il numero totale di persone che vi abitano.
var result = from p in persone
group p by p.Citta into g
orderby g.Count() ascending
select new { Citta = g.Key, Totale = g.Count() };Quest'altro snippet, invece, racchiude i due esempi precedenti raggruppando ed ordinando i dati nello stesso momento.
Contenuti dell'articolo
- Pagina 1
- Pagina 2
- Pagina 3
- Pagina 4
- Pagina 5
Aggiungi un nuovo commento »»»
Per inserire un commento, devi registrarti alla nostra community.








Difficoltà
Utilità
Stampa
Download 



