Visão geral de operadores de consulta padrão (C#)Standard Query Operators Overview (C#)

Os operadores de consulta padrão são os métodos que formam o padrão LINQ.The standard query operators are the methods that form the LINQ pattern. A maioria desses métodos opera em sequências; neste contexto, uma sequência é um objeto cujo tipo implementa a interface IEnumerable<T> ou a interface 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. Os operadores de consulta padrão fornecem recursos de consulta incluindo filtragem, projeção, agregação, classificação e muito mais.The standard query operators provide query capabilities including filtering, projection, aggregation, sorting and more.

Há dois conjuntos de operadores de consulta padrão LINQ, um que opera em objetos do tipo IEnumerable<T> e o outro que opera em objetos do 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>. Os métodos que compõem a cada conjunto são os membros estáticos das classes Enumerable e Queryable, respectivamente.The methods that make up each set are static members of the Enumerable and Queryable classes, respectively. Eles são definidos como métodos de extensão do tipo nos quais operam.They are defined as extension methods of the type that they operate on. Isso significa que eles podem ser chamados usando a sintaxe de método estático ou sintaxe de método de instância.This means that they can be called by using either static method syntax or instance method syntax.

Além disso, vários métodos de operador de consulta padrão operam em tipos diferentes daqueles baseados em IEnumerable<T> ou IQueryable<T>.In addition, several standard query operator methods operate on types other than those based on IEnumerable<T> or IQueryable<T>. O tipo Enumerable define dois métodos tais que ambos operam em objetos do tipo IEnumerable.The Enumerable type defines two such methods that both operate on objects of type IEnumerable. Esses métodos, Cast<TResult>(IEnumerable) e OfType<TResult>(IEnumerable), permitem que você habilite uma coleção sem parâmetros ou não genérica, a ser consultada no padrão LINQ.These 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. Eles fazem isso criando uma coleção de objetos fortemente tipada.They do this by creating a strongly-typed collection of objects. A classe Queryable define dois métodos semelhantes, Cast<TResult>(IQueryable) e OfType<TResult>(IQueryable), que operam em objetos do tipo Queryable.The Queryable class defines two similar methods, Cast<TResult>(IQueryable) and OfType<TResult>(IQueryable), that operate on objects of type Queryable.

Os operadores de consulta padrão são diferentes no momento de sua execução, dependendo de se eles retornam um valor singleton ou uma sequência de valores.The standard query operators differ in the timing of their execution, depending on whether they return a singleton value or a sequence of values. Esses métodos que retornam um valor singleton (por exemplo, Average e Sum) são executados imediatamente.Those methods that return a singleton value (for example, Average and Sum) execute immediately. Os métodos que retornam uma sequência adiam a execução da consulta e retornam um objeto enumerável.Methods that return a sequence defer the query execution and return an enumerable object.

No caso de métodos que operam em coleções na memória, ou seja, os métodos que estendem IEnumerable<T>, o objeto enumerável retornado captura o argumento que foi passado para o método.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 esse objeto é enumerado, a lógica do operador de consulta é empregada e os resultados da consulta são retornados.When that object is enumerated, the logic of the query operator is employed and the query results are returned.

Por outro lado, os métodos que estendem IQueryable<T> não implementam nenhum comportamento de consulta, mas criam uma árvore de expressão que representa a consulta a ser executada.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. O processamento de consulta é tratado pelo objeto IQueryable<T> de origem.The query processing is handled by the source IQueryable<T> object.

Chamadas para métodos de consulta podem ser encadeadas em uma consulta, o que permite que consultas se tornem arbitrariamente complexas.Calls to query methods can be chained together in one query, which enables queries to become arbitrarily complex.

O exemplo de código a seguir demonstra como os operadores de consulta padrão podem ser usados para obter informações sobre uma sequência.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   

Sintaxe de expressão de consultaQuery Expression Syntax

Alguns dos operadores de consulta padrão mais usados têm uma sintaxe de palavra-chave de linguagem C# e Visual Basic dedicada que possibilita que eles sejam chamados como parte de uma expressão de consulta.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. Para obter mais informações sobre operadores de consulta padrão que têm palavras-chave dedicadas e suas sintaxes correspondentes, consulte Sintaxe de expressão de consulta para operadores de consulta padrão (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#).

Estendendo os operadores de consulta padrãoExtending the Standard Query Operators

Você pode aumentar o conjunto de operadores de consulta padrão criando métodos específicos de domínio apropriados para o domínio ou tecnologia de destino.You can augment the set of standard query operators by creating domain-specific methods that are appropriate for your target domain or technology. Você também pode substituir os operadores de consulta padrão por suas próprias implementações que fornecem serviços adicionais, como avaliação remota, conversão de consulta e otimização.You can also replace the standard query operators with your own implementations that provide additional services such as remote evaluation, query translation, and optimization. Para ver um exemplo, consulte AsEnumerable.See AsEnumerable for an example.

Os links a seguir levam você a tópicos que fornecem informações adicionais sobre os vários operadores de consulta padrão com base na funcionalidade.The following links take you to topics that provide additional information about the various standard query operators based on functionality.

Classificando dados (C#)Sorting Data (C#)

Operações de conjunto (C#)Set Operations (C#)

Filtrando dados (C#)Filtering Data (C#)

Operações de quantificador (C#)Quantifier Operations (C#)

Operações de projeção (C#)Projection Operations (C#)

Particionando dados (C#)Partitioning Data (C#)

Operações de junção (C#)Join Operations (C#)

Agrupando dados (C#)Grouping Data (C#)

Operações de geração (C#)Generation Operations (C#)

Operações de Igualdade (C#)Equality Operations (C#)

Operações de elemento (C#)Element Operations (C#)

Convertendo Tipos de Dados (C#)Converting Data Types (C#)

Operações de concatenação (C#)Concatenation Operations (C#)

Operações de agregação (C#)Aggregation Operations (C#)

Consulte tambémSee also