Espressioni query LINQ (Guida per programmatori C#)
Aggiornamento: novembre 2007
LINQ (Language-Integrated Query) è il nome di un insieme di tecnologie basate sull'integrazione di funzionalità di query direttamente nel linguaggio C# (anche in Visual Basic e potenzialmente in qualsiasi altro linguaggio .NET). Con LINQ, una query è un costrutto di linguaggio di prima categoria, esattamente come le classi, i metodi, gli eventi e così via.
Per uno sviluppatore che scrive query, la parte "integrata nel linguaggio" più visibile di LINQ è l'espressione di query. Le espressioni di query vengono scritte in una sintassi di query dichiarativa introdotta in C# 3.0. Utilizzando la sintassi di query, è possibile eseguire operazioni di filtro, ordinamento e raggruppamento anche complesse sulle origini dati con un codice minimo. Si utilizzano gli stessi modelli di espressioni di query di base per eseguire query e trasformare dati in database SQL, Dataset ADO.NET, documenti e flussi XML e insiemi .NET.
Nell'esempio seguente viene illustrata l'operazione di query completa. L'operazione completa include la creazione di un'origine dati, la definizione dell'espressione di query e l'esecuzione della query in un 'istruzione foreach.
class LINQQueryExpressions
{
static void Main()
{
// Specify the data source.
int[] scores = new int[] { 97, 92, 81, 60 };
// Define the query expression.
IEnumerable<int> scoreQuery =
from score in scores
where score > 80
select score;
// Execute the query.
foreach (int i in scoreQuery)
{
Console.Write(i + " ");
}
}
}
// Output: 97 92 81
Per ulteriori informazioni sulle nozioni di base di LINQ in C#, vedere Nozioni di base su LINQ in C#.
Cenni preliminari sulle espressioni di query
Le espressioni di query possono essere utilizzate per eseguire una query e trasformare dati da qualsiasi origine dati abilitata per LINQ. Una sola query, ad esempio, è in grado di recuperare dati da un database SQL e di produrre un flusso XML come output.
Le espressioni di query sono facili da gestire perché utilizzano molti costrutti di linguaggio C# comuni. Per ulteriori informazioni, vedere Nozioni di base su LINQ in C#.
Le variabili in un'espressione di query sono tutte fortemente tipizzate, anche se in molti casi non è necessario specificare il tipo in modo esplicito perché il compilatore è in grado di dedurlo. Per ulteriori informazioni, vedere Relazioni tra i tipi nelle operazioni di query (LINQ).
Una query non viene eseguita finché non viene eseguita un'iterazione sulla variabile di query in un'istruzione foreach. Per ulteriori informazioni, vedere Introduzione alle query LINQ.
In fase di compilazione, le espressioni di query vengono convertite in chiamate al metodo dell'operatore query standard secondo le regole definite nella specifica C#. Le query che possono essere espresse utilizzando la sintassi della query possono essere espresse anche utilizzando la sintassi del metodo. Tuttavia, nella maggior parte dei casi la sintassi della query è più leggibile e concisa. Per ulteriori informazioni, vedere Specifiche del linguaggio C# e Cenni preliminari sugli operatori di query standard.
Come regola di scrittura delle query LINQ, si consiglia di utilizzare la sintassi della query ogni qualvolta è possibile e la sintassi del metodo ogni qualvolta è necessario. Tra le due diverse forme non esiste differenza semantica o a livello di prestazioni. Le espressioni di query sono spesso più leggibili delle espressioni equivalenti scritte nella sintassi del metodo.
Poiché per alcune operazioni di query, ad esempio Count o Max, non esiste una clausola dell'espressione di query equivalente, è necessario esprimerle come chiamata al metodo. La sintassi del metodo può essere combinata con la sintassi della query in svariati modi. Per ulteriori informazioni, vedere Sintassi delle query e sintassi dei metodi (LINQ).
Le espressioni di query possono essere compilate in strutture ad albero dell'espressione o in delegati, a seconda del tipo al quale la query viene applicata. Le query IEnumerable<T> vengono compilate in delegati. Le query IQueryable e IQueryable<T> vengono compilate in strutture ad albero dell'espressione. Per ulteriori informazioni, vedere Strutture ad albero dell'espressione.
Nella tabella seguente sono elencati gli argomenti in cui sono disponibili informazioni aggiuntive sulle query ed esempi di codice per le attività comuni.
Argomento |
Descrizione |
---|---|
Nozioni fondamentali sulle espressioni di query (Guida per programmatori C#) |
Sono introdotti i concetti fondamentali sulle query e vengono forniti esempi di sintassi della query C#. |
Sono forniti esempi di diversi tipi di base di espressioni di query. |
|
Procedura: gestire le eccezioni nelle espressioni di query (Guida per programmatori C#) |
Come e quando spostare codice che genera potenziali eccezioni al di fuori di un'espressione di query. |
Procedura: popolare insiemi di oggetti da più origini (LINQ) |
Come utilizzare l'istruzione select per unire dati da origini diverse in un nuovo tipo. |
Procedura: raggruppare i risultati in vari modi (Guida per programmatori C#) |
Vengono illustrati diversi modi per utilizzare la clausola group. |
Procedura: raggruppare un gruppo (Guida per programmatori C#) |
Viene illustrato come creare gruppi nidificati. |
Procedura: eseguire una sottoquery su un'operazione di raggruppamento (Guida per programmatori C#) |
Viene illustrato come utilizzare una sottoespressione in una query come origine dati per una query nuova. |
Procedura: raggruppare i risultati per chiavi contigue (Guida per programmatori C#) |
Viene illustrato come implementare un operatore di query standard thread-safe in grado di eseguire operazioni di raggruppamento in origini dati di flusso. |
Viene illustrato come specificare un numero arbitrario di valori da utilizzare nei confronti di uguaglianza in una clausola where. |
|
Procedura: archiviare i risultati di una query in memoria (Guida per programmatori C#) |
Viene illustrato come materializzare e archiviare i risultati della query senza utilizzare necessariamente un ciclo foreach. |
Procedura: ottenere una query da un metodo (Guida per programmatori C#) |
Viene illustrato come restituire variabili di query dai metodi e come passarle ai metodi come parametri di input. |
Procedura: eseguire operazioni di join personalizzate (Guida per programmatori C#) |
Viene illustrato come eseguire operazioni di join basate su qualsiasi tipo di funzione predicativa. |
Procedura: eseguire un join utilizzando una chiave composta (Guida per programmatori C#) |
Viene illustrato come unire due origini basate su più di una chiave corrispondente. |
Procedura: ordinare i risultati di una clausola join (Guida per programmatori C#) |
Viene illustrato come ordinare una sequenza prodotta da un'operazione di join. |
Procedura: eseguire degli inner join (Guida per programmatori C#) |
Viene illustrato come eseguire un inner join in LINQ. |
Procedura: eseguire dei join raggruppati (Guida per programmatori C#) |
Viene illustrato come produrre un join raggruppato in LINQ. |
Procedura: eseguire dei left outer join (Guida per programmatori C#) |
Viene illustrato come produrre un left outer join in LINQ. |
Procedura: gestire valori null nelle espressioni di query (Guida per programmatori C#) |
Viene illustrato come gestire valori null nelle query LINQ. |
Vedere anche
Attività
Procedura dettagliata: scrittura di query in C# (LINQ)
Concetti
Operazioni di query di base (LINQ)
Sintassi delle query e sintassi dei metodi (LINQ)
Cenni preliminari sugli operatori di query standard
Riferimenti
Guida generale per programmatori LINQ
Altre risorse
LINQ (Language-Integrated Query)
Parole chiave di query (Riferimenti per C#)
Funzionamento delle query LINQ to Objects
Reading and Writing Queries (informazioni in lingua inglese)
What is a collection? (informazioni in lingua inglese)
Link to Everything: A List of LINQ Providers (informazioni in lingua inglese)