Per effettuare query, LINQ mette a disposizione diversi Extension Methods che, nel caso specifico, vengono chiamati operatori. Oltre all'utilizzo di questi operatori, si possono scrivere query sfruttando anche la Query Syntax (la sintassi che prevede una modalità di scrittura simile a SQL), ma questa viene comunque convertita dal compilatore in Extension Methods e, soprattutto, non offre le stesse potenzialità in quanto copre solo una parte degli operatori. Per questo motivo, in tutto il resto dell'articolo, verranno mostrati gli esempi esclusivamente utilizzando Extension Methods.
Tipologia di operatori
Gli operatori si possono dividere in diverse categorie che sono riportate in questa tabella:
Restrizione | Where, OfType | Utilizzato per filtrare i risultati |
Proiezione | Select, SelectMany | Utilizzato per filtrare i risultati |
Partizionamento | Take, TakeWhile, Skip, SkipWhile | Utilizzato per ottenere solo un determinato numero di oggetti |
Ordinamento | OrderBy, OrderByDescending, ThenBy, ThenByDescending, Reverse | Utilizzato per ordinare i risultati ottenuti |
Raggruppamento | GroupBy | Utilizzato per raggruppare i risultati in base ad un oggetto |
Lista | Distinct, Union, Except, Intersect | Utilizzati per effettuare operazioni di intersezione fra due o più le liste |
Conversione | ToArray, ToList, ToDictionary, Cast, AsEnumerable, AsQueryable, ToLookup | Utilizzati per trasformare |
Quantificazione | All, Any, Contains | Utilizzati per stabilire se ci sono elementi che soddisfano una determinata condizione |
Intersezione | Join, GroupJoin | Utilizzati per mettere in relazione due liste |
Generazione | DefaultIfEmpty, Empty, Range, Repeat | Utilizzati per generare risultati |
Uguaglianza | SequenceEqual | Utilizzato per verificare che due liste siano esattamente uguali |
Elemento | ElementAt, ElementAtOrDefault, First, FirstOrDefault, Last, LastOrDefault, Single, SingleOrDefault | Utilizzato per avere l'elemento ad una specifica posizione |
Concatenamento | Concat | Utilizzato per unire due liste in una sola |
Aggregazione | Aggregate, Average, Count, LongCount, Max, Min, Sum | Utilizzati per ottenere risultati su una aggregazione di dati |
Nella maggior parte dei casi, gli operatori necessari sono quelli di restrizione, proiezione, ordinamento, partizionamento, lista, aggregazione, elemento, raggruppamento e conversione. Essendo questi appena menzionati gli operatori più importanti, nel corso dell'articolo saranno gli unici ad essere analizzati.
Prima di cominciare
I dati su cui verranno effettuate le query nel corso dell'articolo sono rappresentati da una lista di oggetti Persona con quattro proprietà: Nome, Cognome, Eta e Figli.
public class Persona { public string Nome { get; set; } public string Cognome { get; set; } public int Eta { get; set; } public List<Persona> Figli { get; set; } }
La lista viene popolata tramite il seguente codice.
List<Persona> persone = new List<Persona> { new Persona { Cognome = "Mostarda", Nome = "Stefano" , Eta=28, Figli = new List<Persona> { new Persona { Cognome = "Mostarda", Nome = "Valerio" , Eta=2 }, new Persona { Cognome = "Mostarda", Nome = "Giulio" , Eta=1 }, }, }, new Persona { Cognome = "Bochicchio", Nome = "Daniele" , Eta=28, Figli = new List<Persona> { new Persona {Cognome = "Bochicchio",Nome = "Alessio" , Eta=7}, }, }, new Persona { Cognome = "Civera", Nome = "Cristian" , Eta=25, Figli = new List<Persona> { new Persona { Cognome = "Civera", Nome = "Silvia" , Eta=3 }, }, }, new Persona { Cognome = "Leoncini", Nome = "Alessio" , Eta=32, Figli = new List<Persona> { new Persona { Cognome = "Leoncini", Nome = "Mario" , Eta=3 }, }, }, new Persona { Cognome = "Leoncini", Nome = "Marco" , Eta=32, Figli = new List<Persona> { new Persona { Cognome = "Leoncini", Nome = "Emauela" , Eta=1}, }, } };
Operatori di restrizione
Where
Questo operatore è perfettamente uguale all'omonima clausola SQL e serve per effettuare un filtro sui dati da interrogare.
var result = persone.Where(p => p.Eta > 30);
Nel momento in cui la query viene eseguita, la variabile result viene popolata con gli oggetti Persona dove la proprietà Eta è maggiore di 30.
Il metodo Where ha due overload dove il secondo accetta oltre all'oggetto di input, anche il suo indice nella lista analizzata.
var result = persone.Where((p, i) => (i % 2) == 0);
In questo caso, result contiene gli oggetti che hanno un indice pari.
OfType
Questo metodo permette di filtrare gli oggetti di una lista in base al loro tipo. Ad esempio, supponendo di avere una pagina o una form con diversi oggetti, si possono avere tutte le Textbox o le DropDownList sfruttando la proprietà Controls.
Nel caso della lista che si usa in questo articolo, un filtro in base al tipo è completamente inutile poiché gli elementi sono tutti di tipo Persona.
Da notare che questo metodo ha una sua particolarità; la firma del metodo non accetta in input il tipo di oggetto da ricercare, bensì lo accetta tramite la sintassi che sfrutta i Generics.
var result = persone.OfType<Persona>();
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.