Introduzione alle query con LINQ

di Stefano Mostarda, in LINQ,

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:

RestrizioneWhere, OfTypeUtilizzato per filtrare i risultati
ProiezioneSelect, SelectManyUtilizzato per filtrare i risultati
PartizionamentoTake, TakeWhile, Skip, SkipWhileUtilizzato per ottenere solo un determinato numero di oggetti
OrdinamentoOrderBy, OrderByDescending, ThenBy, ThenByDescending, ReverseUtilizzato per ordinare i risultati ottenuti
RaggruppamentoGroupByUtilizzato per raggruppare i risultati in base ad un oggetto
ListaDistinct, Union, Except, IntersectUtilizzati per effettuare operazioni di intersezione fra due o più le liste
ConversioneToArray, ToList, ToDictionary, Cast, AsEnumerable, AsQueryable, ToLookupUtilizzati per trasformare
QuantificazioneAll, Any, ContainsUtilizzati per stabilire se ci sono elementi che soddisfano una determinata condizione
IntersezioneJoin, GroupJoinUtilizzati per mettere in relazione due liste
GenerazioneDefaultIfEmpty, Empty, Range, RepeatUtilizzati per generare risultati
UguaglianzaSequenceEqualUtilizzato per verificare che due liste siano esattamente uguali
ElementoElementAt, ElementAtOrDefault, First, FirstOrDefault, Last, LastOrDefault, Single, SingleOrDefaultUtilizzato per avere l'elemento ad una specifica posizione
ConcatenamentoConcatUtilizzato per unire due liste in una sola
AggregazioneAggregate, Average, Count, LongCount, Max, Min, SumUtilizzati 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>();
3 pagine in totale: 1 2 3
Contenuti dell'articolo

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti