Introduzione alle query con LINQ

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

Operatori di proiezione

Gli operatori di proiezione servono per modificare l'output di una query.

Select

Se si vuole mostrare a video una griglia di oggetti persona con solo il nome ed il cognome in un campo solo, si può sfruttare il metodo Select per fa restituire direttamente la stringa di cui si ha bisogno senza dover così di effettuare la trasformazione al momento del binding tra i dati ed il controllo.

var result = persone.Select(p => p.Nome + " " + p.Cognome);

Questa query torna una lista di stringhe, ma nel caso si volessero tornare i campi nome e cognome separati, bisognerebbe ricorrere a un AnonymousType.

var result = persone.Select(p => new { p.Nome, p.Cognome });

Anche questo operatore, come Where, ha un secondo overload dove accetta in input l'indice dell'oggetto nella lista originale permettendo, quindi, di modificare l'output in base a questa condizione.

SelectMany

Quando si parla di oggetti, non si ragiona in termini di colonne e righe come in un database, ma si parla di proprietà che possono essere, a loro volta, complesse o una lista di oggetti. Per venire incontro a questa seconda possibilità, si è introdotto l'operatore SelectMany che permette di rendere piatta una lista che altrimenti sarebbe complessa.

Supponendo di voler tornare tutti i figli di una persona, si potrebbe scrivere la seguente query.

var result = persone.Select(p => p.Figli);

Il problema di questa query è che viene tornata una lista di liste di oggetti Persona che rappresentano i figli. In questo modo, si dovrebbe eseguire un ciclo con un ciclo innestato per ottenere una lista completa dei figli. Per evitare questo, si ricorre all'operatore SelectMany che effettua il doppio ciclo automaticamente popolando una sola lista con tutti i dati.

var result = persone.SelectMany(p => p.Figli);

Operatori di ordinamento

Gli operatori di ordinamento servono per ordinare il risultato restituito da una query.

OrderBy, OrderByDescending

Questi operatori sono equivalenti ai loro (quasi) omonimi del SQL. La differenza che distingue i due metodi tra loro, come s'intuisce dai nomi, è che il primo ordina in maniera ascendente, mentre il secondo effettua la cosa contraria.

var result = persone.OrderBy(p => p.Eta);
var resultDesc = persone.OrderByDescending(p => p.Eta);
ThenBy, ThenByDescending

Un operatore OrderBy può effettuare l'ordinamento in base ad un solo campo e può essere ripetuto una sola volta in una query (Quando lo si usa più volte, l'effetto è che viene effettuato l'ordinamento sul campo specificato l'ultima volta). Per questo motivo, è stato introdotto l'operatore ThenBy ed il suo opposto ThenByDescending.

var result = persone.OrderBy(p => p.Eta).ThenBy(p => p.Nome);
var resultDesc = persone.OrderByDescending(p => p.Eta).ThenByDescending(p => p.Nome);
Reverse

Questo operatore offre la possibilità di invertire l'ordinamento degli oggetti dal primo all'ultimo.

var result = persone.Reverse<Persona>();

Operatori di partizionamento

Questi operatori permettono di selezionare il numero di elementi che si vogliono ottenere da una query. Il caso principale in cui questi tornano utili è la paginazione dei risultati.

Take

Questo operatore recupera le prime n istanze di oggetti all'interno di una lista. La firma di questo operatore prevede un solo argomento in input, di tipo int, il quale specifica il numero di istanze da recuperare.

var result = persone.Take(3);
Skip

Questo operatore esclude dal risultato di una query le prime n istanze di oggetti all'interno di una lista. La firma di questo operatore prevede un solo argomento in input, di tipo int, il quale specifica il numero di istanze da escludere.

var result = persone.Skip(3);

L'unione del metodo Skip con Take permette di effettuare una paginazione in maniera molto semplice. Ad esempio, il seguente codice recupera gli oggetti dall'undicesimo al ventesimo.

var result = persone.Skip(10).Take(10);

È molto importante seguire questo ordine dei metodi, invertendoli si otterrebbero solo i primi dieci elementi della lista.

TakeWhile

Questo operatore permette di recuperare le prime istanze di una lista che soddisfano una determinata condizione. A prima vista, questo metodo sembra uguale a Where; in realtà c'è una grossa differenza: nel momento in cui un elemento nella lista non soddisfa la condizione specificata nel metodo, gli oggetti successivi non vengono restituiti a prescindere dal fatto che soddisfino la condizione.

var result = persone.TakeWhile(p => p.Eta >= 28);

In questo caso, vengono restituiti solo i primi due oggetti nella lista in quanto il terzo non soddisfa la condizione e quindi gli altri (che pure soddisferebbero le condizioni) non vengono tornati.

SkipWhile

Sulla stessa riga del precedente operatore, questo permette di escludere i primi elementi di una lista che soddisfano una determinata condizione. Quando un elemento nella lista non soddisfa la condizione, gli oggetti successivi vengono restituiti a prescindere dalla condizione.

var result = persone.SkipWhile(p => p.Eta >= 28);

In questo caso, vengono restituiti solo gli ultimi tre oggetti nella lista in quanto il terzo non soddisfa la condizione e quindi quello ed i successivi vengono restituiti.

3 pagine in totale: <<Indietro 1 [2] 3 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.

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



TUTORIALS


IN EVIDENZA
MISC