Introduzione a LINQ

5 pagine in totale: <<Indietro 1 [2] 3 4 5 Avanti >>

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.

Autocompletition in LINQ

Autocompletition in LINQ

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.

5 pagine in totale: <<Indietro 1 [2] 3 4 5 Avanti >>

Contenuti dell'articolo

Commenti
Dai un voto a questo articolo, ci aiuterà a migliorare il nostro sito (1 è il voto minimo, 5 il massimo).

Per procedere al rating dell'articolo devi essere autenticato.
dadox77 scrive:
Introduzione a LINQ

Ciao StefanoIntanto complimenti per lo splendido articolo...Mai come in questo caso posso dire "quanto è piccolo il web"...ci siamo lasciati in quel ...
lunedì 24 marzo 2008

Aggiungi un nuovo commento »»»
Per inserire un commento, devi registrarti alla nostra community.



TUTORIALS


IN EVIDENZA
MISC