This article has been localized into Italian by the community.
LINQ: sintassi di Query e sintassi di Metodo
Nell'articolo precedente, abbiamo dato un'occhiata rapida a come si presentano entrambe le sintassi LINQ, ma rivediamole di nuovo l'una a fianco all'altra, così da essere sicuri di cosa andiamo a discutere in questo articolo:
var listOfNames = new List<string>()
{
"John Doe",
"Jane Doe",
"Jenna Doe",
"Joe Doe"
};
// Query syntax
var qNames = from name in listOfNames where name.Length <= 8 select name;
// Method syntax
var mNames = listOfNames.Where(name => name.Length <= 8);
Mentre le due linee di codice svolgono lo stesso compito, la differenza sintattica è piuttosto chiara: la sintassi di query si assomiglia agli altri linguaggi di tipo "query", come SQL e meno come un tipico costrutto C#. La sintassi di metodo, d'altro lato, è come il resto del codice C# visto in questo tutorial.
Così, la differenza più grande è sicuramente solo la sintassi e perciò, vedremo usate entrambe le varianti quando leggiamo articoli su C# e nella ricerca di risposte a domande che si potrebbe avere. Sembra che la sintassi di query sia leggermente più popolare perché alcune persone la trovano più facile da leggere della sintassi di metodo. Queste potrebbero essere persone che sono comunque abituate a effettuare operazioni di recupero di dati in SQL. D'altro canto, se non si è mai usato prima un linguaggio come SQL, ma si ha un po' di esperienza in C#, si potrebbe trovare la sintassi di metodo più facile da leggere. Inoltre, per almeno un paio di operazioni, come il conteggio degli elementi nel risultato di una query, si deve usare la sintessi di metodo.
Espressioni Lambda
Nell'esempio con la sintassi di metodo, potreste notare qualcosa che non avete visto finora, come parametro del metodo Where(). Appare così:
name => name.Length <= 8
Questa si chiama espressione Lambda e, mentre non è specifica della funzionalità di LINQ, è usata MOLTO nel mondo di LINQ. Perciò la vedrete parecchio negli articoli seguenti, e nonostante le espressioni Lambda saranno approfondite in dettaglio in un altro articolo, questo è un buon momento per averne una comprensione base del loro funzionamento.
È effettivamente piuttosto semplice. Una espressione Lambda ha una parte sinistra e una parte destra, divisa dall'operatore => (da non confondere con l'operatore "maggiore di o minore di", che è questo: >=).
Nella parte sinistra, abbiamo i parametri in input. Ce ne possono essere diversi, ma nel nostro esempio ce n'è solo uno, che è la variabile name. In questo caso, arriva dal metodo Where(), che cicla la lista di nomi e da cui prendiamo il nome. Ho scelto "name", perché è quello che si trova in una lista di nomi, ma si può chiamare "x", "z", "foobar" o in qualunque altro modo.
Nella parte destra abbiamo la parte di espressione/dichiarazione. Qui è dove generiamo il risultato atteso. In questo caso, un valore booleano che dice al metodo Where() se deve includere o meno il nome in questione. Lo indichiamo con una espressione, che dice che vogliamo includere il nome se ha una lunghezza di 8 (o meno) caratteri. Possiamo (ma non è necessario) usare l'input (parte sinistra) per determinarlo. Di nuovo, ci riferiamo ad esso con "name", ma avremmo invece potuto chiamarlo "x". In quel caso, la dichiarazione sarebbe stata come questa:
var mNames = listOfNames.Where(x => x.Length <= 8);
Le espressioni Lambda sono qualcosa di più di sole query LINQ, ma come detto, sono importanti usando LINQ. Lo vedremo nei prossimi articoli. Se si vuole approfondire le espressioni Lambda in generale, cercate in altre parti di questo tutorial dove l'argomento è trattato.
Riepilogo
LINQ è fornito in due diverse varianti sintattiche: la sintassi di Query e la sintassi di Metodo. Entrambe possono fare quasi le stesse cose, ma mentre la sintassi di query è praticamente un nuovo linguaggio all'interno di C#, la sintassi di metodo sembra proprio come normali chiamate di metodi di C#. In questo tutorial, useremo principalmente la sintassi di metodo durante la discussione delle diverse operazioni disponibili con LINQ nei prossimi articoli.