Espressioni di query LINQ (Guida per programmatori C#)

LINQ (Language-Integrated Query) è il nome di un set 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 sono scritte in una sintassi di query dichiarativa introdotta in C# 3.0. Tramite la sintassi di query, è persino possibile eseguire operazioni di filtro, ordinamento e raggruppamento complesse su origini dati con una quantità minima di codice. Si utilizzano gli stessi modelli di espressioni di query di base per eseguire query e trasformare dati in database SQL, set di dati 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 (C#).

  • 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 (C#).

  • 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 Confronto tra sintassi di query LINQ e sintassi dei metodi (C#).

  • Le espressioni di query possono essere compilate in strutture ad albero dell'espressione o in delegati, a seconda del tipo al quale viene applicata la query. 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 (C# e Visual Basic).

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#.

Procedura: scrivere query LINQ in 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 di una query (Guida per programmatori C#)

Vengono illustrati diversi modi per utilizzare la clausola group.

Procedura: creare un gruppo annidato (Guida per programmatori C#)

Viene illustrato come creare gruppi annidati.

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.

Procedura: specificare dinamicamente i filtri dei predicati in fase di esecuzione (Guida per programmatori C#)

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

Guida per programmatori C#

Operazioni di query LINQ di base (C#)

Confronto tra sintassi di query LINQ e sintassi dei metodi (C#)

Cenni preliminari sugli operatori di query standard

Altre risorse

LINQ (Language-Integrated Query)

Parole chiave di query (Riferimenti per C#)

Funzionamento delle query LINQ to Objects

Lettura e scrittura di query

Informazioni sugli insiemi

Semplicità di collegamento: un elenco di provider LINQ