Cenni preliminari sugli operatori di query standard (C#)Standard Query Operators Overview (C#)

Gli operatori di query standard sono metodi che costituiscono il modello LINQ.The standard query operators are the methods that form the LINQ pattern. La maggior parte di questi metodi agisce sulle sequenze. Una sequenza è un oggetto il cui tipo implementa l'interfaccia IEnumerable<T> o l'interfaccia IQueryable<T>.Most of these methods operate on sequences, where a sequence is an object whose type implements the IEnumerable<T> interface or the IQueryable<T> interface. Gli operatori di query standard forniscono le funzionalità di query che includono filtro, proiezione, aggregazione, ordinamento e altro ancora.The standard query operators provide query capabilities including filtering, projection, aggregation, sorting and more.

Sono disponibili due set 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>.There are two sets of LINQ standard query operators, one that operates on objects of type IEnumerable<T> and the other that operates on objects of type IQueryable<T>. I metodi che costituiscono ogni set sono membri statici delle classi Enumerable e Queryable, rispettivamente.The methods that make up each set are static members of the Enumerable and Queryable classes, respectively. Vengono definiti come metodi di estensione del tipo su cui agiscono.They are defined as extension methods of the type that they operate on. Ciò significa che possono essere chiamati usando la sintassi del metodo statico o la sintassi del metodo di istanza.This means that they can be called by using either static method syntax or instance method syntax.

Inoltre, molti metodi degli operatori query standard agiscono su tipi diversi da quelli basati su IEnumerable<T> o IQueryable<T>.In addition, several standard query operator methods operate on types other than those based on IEnumerable<T> or IQueryable<T>. Il tipo Enumerable definisce questi due diversi metodi che agiscono entrambi su oggetti di tipo IEnumerable.The Enumerable type defines two such methods that both operate on objects of type IEnumerable. Questi metodi, Cast<TResult>(IEnumerable) e OfType<TResult>(IEnumerable), consentono l'esecuzione di query su una Collection senza parametri o non generica nel modello LINQThese methods, Cast<TResult>(IEnumerable) and OfType<TResult>(IEnumerable), let you enable a non-parameterized, or non-generic, collection to be queried in the LINQ pattern. grazie alla creazione di una Collection di oggetti fortemente tipizzato.They do this by creating a strongly-typed collection of objects. La classe Queryable definisce due metodi simili, Cast<TResult>(IQueryable) e OfType<TResult>(IQueryable), che agiscono su oggetti di tipo Queryable.The Queryable class defines two similar methods, Cast<TResult>(IQueryable) and OfType<TResult>(IQueryable), that operate on objects of type Queryable.

Gli operatori di query standard presentano una durata di esecuzione diversa, a seconda che restituiscano un valore singleton o una sequenza di valori.The standard query operators differ in the timing of their execution, depending on whether they return a singleton value or a sequence of values. Questi metodi che restituiscono un valore singleton, ad esempio Average e Sum, vengono eseguiti immediatamente.Those methods that return a singleton value (for example, Average and Sum) execute immediately. I metodi che restituiscono una sequenza rinviano l'esecuzione della query e restituiscono un oggetto enumerabile.Methods that return a sequence defer the query execution and return an enumerable object.

Nel caso dei metodi che agiscono sulle Collection in memoria, ovvero i metodi che estendono IEnumerable<T>, l'oggetto enumerabile restituito acquisisce gli argomenti passati al metodo.In the case of the methods that operate on in-memory collections, that is, those methods that extend IEnumerable<T>, the returned enumerable object captures the arguments that were passed to the method. Quando l'oggetto viene enumerato, viene utilizzata la logica dell'operatore query e vengono restituiti i risultati della query.When that object is enumerated, the logic of the query operator is employed and the query results are returned.

I metodi che estendono IQueryable<T> non implementano invece il comportamento delle query, ma compilano un albero delle espressioni che rappresenta la query da eseguire.In contrast, methods that extend IQueryable<T> do not implement any querying behavior, but build an expression tree that represents the query to be performed. L'elaborazione delle query viene gestita dall'oggetto IQueryable<T> di origine.The query processing is handled by the source IQueryable<T> object.

Le chiamate ai metodi della query possono essere concatenate in una query, consentendo alle query di diventare arbitrariamente complesse.Calls to query methods can be chained together in one query, which enables queries to become arbitrarily complex.

Nell'esempio di codice seguente viene illustrato come usare gli operatori di query standard per ottenere informazioni su una sequenza.The following code example demonstrates how the standard query operators can be used to obtain information about a sequence.

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 delle espressioni di queryQuery Expression Syntax

Alcuni degli operatori di query standard usati più di frequente dispongono di sintassi dedicata delle parole chiave per i linguaggi C# e Visual Basic che consente di chiamare gli operatori come parte di un'espressione di query.Some of the more frequently used standard query operators have dedicated C# and Visual Basic language keyword syntax that enables them to be called as part of a query expression. Per altre 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 (C#).For more information about standard query operators that have dedicated keywords and their corresponding syntaxes, see Query Expression Syntax for Standard Query Operators (C#).

Estensione degli operatori di query standardExtending the Standard Query Operators

È possibile estendere il set di operatori di query standard creando metodi specifici del dominio appropriati per la tecnologia o il dominio di destinazione.You can augment the set of standard query operators by creating domain-specific methods that are appropriate for your target domain or technology. È possibile anche 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.You can also replace the standard query operators with your own implementations that provide additional services such as remote evaluation, query translation, and optimization. Per un esempio, vedere AsEnumerable.See AsEnumerable for an example.

I collegamenti riportati di seguito consentono di passare ad argomenti che forniscono informazioni aggiuntive sui vari operatori di query standard in base alla funzionalità.The following links take you to topics that provide additional information about the various standard query operators based on functionality.

Ordinamento dei dati (C#)Sorting Data (C#)

Operazioni sui set (C#)Set Operations (C#)

Filtro di dati (C#)Filtering Data (C#)

Operazioni del quantificatore (C#)Quantifier Operations (C#)

Operazioni di proiezione (C#)Projection Operations (C#)

Partizionamento dei dati (C#)Partitioning Data (C#)

Operazioni di join (C#)Join Operations (C#)

Raggruppamento dei dati (C#)Grouping Data (C#)

Operazioni di generazione (C#)Generation Operations (C#)

Operazioni di uguaglianza (C#)Equality Operations (C#)

Operazioni sugli elementi (C#)Element Operations (C#)

Conversione del tipo di dati (C#)Converting Data Types (C#)

Operazioni di concatenazione (C#)Concatenation Operations (C#)

Operazioni di aggregazione (C#)Aggregation Operations (C#)

Vedere ancheSee also