Cenni preliminari sugli operatori di query standard

Gli operatori di query standard rappresentano i metodi che formano il modello LINQ (Language-Integrated Query). La maggior parte di questi metodi agisce sulle sequenze, dove una sequenza è un oggetto il cui tipo implementa l'interfaccia IEnumerable<T> o l'interfaccia IQueryable<T>. Gli operatori di query standard forniscono funzionalità di query, tra cui filtro, proiezione, aggregazione, ordinamento e altro ancora.

Sono disponibili due insiemi di operatori di query standard LINQ, uno che agisce sugli oggetti di tipo IEnumerable<T> e l'altro che agisce sugli oggetti di tipo IQueryable<T>. I metodi che costituiscono ogni insieme sono membri statici rispettivamente delle classi Enumerable e Queryable. Vengono definiti come metodi di estensione del tipo sul quale agiscono. Ciò significa che possono essere chiamati utilizzando la sintassi del metodo statico o la sintassi del metodo di istanza.

Inoltre, molti metodi degli operatori di query standard agiscono su tipi diversi da quelli basati su IEnumerable<T> o IQueryable<T>. Il tipo Enumerable definisce due diversi metodi che agiscono entrambi su oggetti di tipo IEnumerable. Questi metodi, Cast<TResult>(IEnumerable) e OfType<TResult>(IEnumerable), consentono l'esecuzione di query su un insieme senza parametri o non generico nel modello LINQ grazie alla creazione di un insieme di oggetti fortemente tipizzato. La classe Queryable definisce due metodi simili, Cast<TResult>(IQueryable) e OfType<TResult>(IQueryable), che agiscono su oggetti di tipo Queryable.

Gli operatori di query standard presentano una durata di esecuzione diversa, a seconda che restituiscano un valore singleton o una sequenza di valori. I metodi che restituiscono un valore singleton, ad esempio Average e Sum, vengono eseguiti immediatamente. I metodi che restituiscono una sequenza rinviano l'esecuzione della query e restituiscono un oggetto enumerabile.

Nel caso dei metodi che agiscono sugli insiemi in memoria, ovvero i metodi che estendono IEnumerable<T>, l'oggetto enumerabile restituito acquisisce gli argomenti passati al metodo. Quando l'oggetto viene enumerato, viene utilizzata la logica dell'operatore di query e vengono restituiti i risultati della query.

I metodi che estendono IQueryable<T> non implementano invece il comportamento delle query, ma compilano una struttura ad albero dell'espressione che rappresenta la query da eseguire. L'elaborazione delle query viene gestita dall'oggetto IQueryable<T> di origine.

Le chiamate ai metodi della query possono essere concatenate in una query, consentendo alle query di diventare arbitrariamente complesse.

Nell'esempio di codice seguente viene illustrato come utilizzare gli operatori di query standard per ottenere informazioni su una sequenza.

        Dim sentence = "the quick brown fox jumps over the lazy dog"
        ' Split the string into individual words to create a collection.
        Dim words = sentence.Split(" "c)

        Dim query = From word In words 
                    Group word.ToUpper() By word.Length Into gr = Group 
                    Order By Length _
                    Select Length, GroupedWords = gr

        Dim output As New System.Text.StringBuilder
        For Each obj In query
            output.AppendLine(String.Format("Words of length {0}:", obj.Length))
            For Each word As String In obj.GroupedWords
                output.AppendLine(word)
            Next
        Next

        'Display the output
        MsgBox(output.ToString())

        ' This code example produces the following output:
        '
        ' Words of length 3:
        ' THE
        ' FOX
        ' THE
        ' DOG
        ' Words of length 4:
        ' OVER
        ' LAZY
        ' Words of length 5:
        ' QUICK
        ' BROWN
        ' JUMPS 

           string sentence = "the quick brown fox jumps over the lazy dog";
           // Split the string into individual words to create a collection.
           string[] words = sentence.Split(' ');

           // Using query expression syntax.
           var query = from word in words
                       group word.ToUpper() by word.Length into gr
                       orderby gr.Key
                       select new { Length = gr.Key, Words = gr };

           // Using method-based query syntax.
           var query2 = words.
               GroupBy(w => w.Length, w => w.ToUpper()).
               Select(g => new { Length = g.Key, Words = g }).
               OrderBy(o => o.Length);

           foreach (var obj in query)
           {
               Console.WriteLine("Words of length {0}:", obj.Length);
               foreach (string word in obj.Words)
                   Console.WriteLine(word);
           }

           // This code example produces the following output:
           //
           // Words of length 3:
           // THE
           // FOX
           // THE
           // DOG
           // Words of length 4:
           // OVER
           // LAZY
           // Words of length 5:
           // QUICK
           // BROWN
           // JUMPS 

Sintassi di espressione della query

Alcuni degli operatori di query standard utilizzati più di frequente dispongono di sintassi dedicata delle parole chiave per i linguaggi C# e Visual Basic. Tale sintassi consente di chiamare gli operatori come parte di un'espressione di query. Per ulteriori informazioni sugli operatori di query standard con parole chiave dedicate e le relative sintassi, vedere Sintassi di espressione della query per operatori di query standard.

Estensione degli operatori di query standard

È possibile estendere l'insieme di operatori di query standard creando metodi specifici del dominio appropriati per la tecnologia o il dominio di destinazione. È inoltre possibile sostituire gli operatori di query standard con implementazioni personalizzate che forniscono servizi aggiuntivi, ad esempio la valutazione remota, la conversione delle query e l'ottimizzazione. Per un esempio, vedere AsEnumerable<TSource>.

Sezioni correlate

I collegamenti riportati di seguito consentono di passare ad argomenti che forniscono informazioni aggiuntive sui vari operatori di query standard in base alla funzionalità.

Ordinamento dei dati

Operazioni sui set

Filtraggio dei dati

Operazioni del quantificatore

Operazioni di proiezione

Partizionamento dei dati

Operazioni di join

Raggruppamento dei dati

Operazioni di generazione

Operatori di uguaglianza

Operazioni sugli elementi

Conversione del tipo di dati

Operazioni di concatenazione

Operazioni di aggregazione

Vedere anche

Riferimenti

Enumerable

Queryable

Metodi di estensione (Guida per programmatori C#)

Concetti

Introduzione alle query LINQ (C#)

Sintassi di espressione della query per operatori di query standard

Classificazione degli operatori di query standard in base alla modalità di esecuzione

Metodi di estensione (Visual Basic)