Procedura: scrivere query LINQ in C#

In questo argomento vengono illustrate le tre modalità in cui è possibile scrivere una query LINQ in C#:

  1. Uso della sintassi della query.

  2. Uso della sintassi del metodo.

  3. Uso di una combinazione di sintassi della query e sintassi del metodo.

Negli esempi seguenti vengono dimostrate alcune query semplici LINQ utilizzando ogni approccio sopra elencato. In generale, la regola prevede di utilizzare (1) ogni qualvolta è possibile e di utilizzare (2) e (3) ogni qualvolta è necessario.

Nota

Queste query operano su semplici insiemi in memoria. La sintassi di base, tuttavia, è identica a quella utilizzata in LINQ to SQL e LINQ to XML.

Esempio

Sintassi della query

Il modo consigliato per scrivere la maggior parte delle query è di utilizzare la sintassi della query per creare espressioni di query. Nell'esempio seguente vengono illustrate tre espressioni di query. La prima espressione di query dimostra come filtrare o limitare i risultati applicando le condizioni con una clausola where. Restituisce tutti gli elementi nella sequenza di origine i cui valori sono maggiori di 7 o minori di 3. La seconda espressione dimostra come ordinare i risultati restituiti. La terza espressione dimostra come raggruppare i risultati secondo una chiave. Questa query restituisce due gruppi basati sulla prima lettera della parola.

// Query #1.
List<int> numbers = new List<int>() { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };

// The query variable can also be implicitly typed by using var
IEnumerable<int> filteringQuery =
    from num in numbers
    where num < 3 || num > 7
    select num;

// Query #2.
IEnumerable<int> orderingQuery =
    from num in numbers
    where num < 3 || num > 7
    orderby num ascending
    select num;

// Query #3.
string[] groupingQuery = { "carrots", "cabbage", "broccoli", "beans", "barley" };
IEnumerable<IGrouping<char, string>> queryFoodGroups =
    from item in groupingQuery
    group item by item[0];

Si noti che il tipo delle query è IEnumerable<T>. Tutte queste query potrebbero essere scritte tramite var, come è illustrato nell'esempio seguente:

var query = from num in numbers...

In ogni esempio precedente, le query non vengono effettivamente eseguite finché non si scorre la variabile della query in un'istruzione foreach. Per ulteriori informazioni, vedere la classe Introduzione alle query LINQ (C#).

Sintassi del metodo

Alcune operazioni di query devono essere espresse come chiamata al metodo. I metodi di questo genere più comuni sono quelli che restituiscono valori numerici singleton, ad esempio Sum, MaxMin, Averagee così via. Questi metodi devono essere sempre chiamati per ultimi in qualsiasi query perché rappresentano un solo valore e non possono fungere da origine per un'operazione di query aggiuntiva. Nell'esempio seguente viene illustrata una chiamata al metodo in un'espressione di query:

List<int> numbers1 = new List<int>() { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
List<int> numbers2 = new List<int>() { 15, 14, 11, 13, 19, 18, 16, 17, 12, 10 };
// Query #4.
double average = numbers1.Average();

// Query #5.
IEnumerable<int> concatenationQuery = numbers1.Concat(numbers2);

Gli eventuali parametri presenti nel metodo vengono specificati con il formato di un'espressione lambda, come è illustrato nell'esempio seguente:

// Query #6.
IEnumerable<int> largeNumbersQuery = numbers2.Where(c => c > 15);

Tra le query precedenti, solo la numero 4 viene eseguita immediatamente, perché restituisce un solo valore e non un insieme IEnumerable<T> generico. Il metodo stesso deve utilizzare foreach per calcolare il valore.

Ognuna delle query precedenti può essere scritta utilizzando la tipizzazione implicita con var, come è illustrato nell'esempio seguente:

// var is used for convenience in these queries
var average = numbers1.Average();
var concatenationQuery = numbers1.Concat(numbers2);
var largeNumbersQuery = numbers2.Where(c => c > 15);

Sintassi mista del metodo e della query

In questo esempio viene mostrato come utilizzare la sintassi del metodo sui risultati di una clausola query. Racchiudere l'espressione di query nelle parentesi e quindi applicare l'operatore punto e chiamare il metodo. Nell'esempio seguente, la query n. 7 restituisce un conteggio dei numeri il cui valore è compreso tra 3 e 7. In generale, tuttavia, è meglio utilizzare una seconda variabile per archiviare il risultato della chiamata al metodo. In questo modo, è meno probabile che la query venga confusa con i risultati della query.

// Query #7.

// Using a query expression with method syntax
int numCount1 =
    (from num in numbers1
     where num < 3 || num > 7
     select num).Count();

// Better: Create a new variable to store
// the method call result
IEnumerable<int> numbersQuery =
    from num in numbers1
    where num < 3 || num > 7
    select num;

int numCount2 = numbersQuery.Count();

La query n. 7 viene eseguita immediatamente, perché restituisce un solo valore e non un insieme.

La query precedente può essere scritta utilizzando la tipizzazione implicita con var, come segue:

var numCount = (from num in numbers...

Può essere scritta nella sintassi del metodo come segue:

var numCount = numbers.Where(n => n < 3 || n > 7).Count();

Può essere scritta utilizzando la tipizzazione esplicita, come segue:

int numCount = numbers.Where(n => n < 3 || n > 7).Count();

Vedere anche

Attività

Procedura dettagliata: scrittura di query in C# (LINQ)

Riferimenti

Clausola where (Riferimento C#)

Concetti

Espressioni di query LINQ (Guida per programmatori C#)

Altre risorse

LINQ (Language-Integrated Query)