Общие сведения о стандартных операторах запроса (C#)Standard Query Operators Overview (C#)

Стандартные операторы запросов — это методы, формирующие шаблон LINQ.The standard query operators are the methods that form the LINQ pattern. Большинство этих методов работают с последовательностями. В данном контексте последовательность — это объект, тип которого реализует интерфейс IEnumerable<T> или 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. Функциональные возможности стандартных операторов запросов включают фильтрацию, проекцию, статистическую обработку, сортировку и многие другие.The standard query operators provide query capabilities including filtering, projection, aggregation, sorting and more.

Существует два набора стандартных операторов запросов LINQ, один из них работает с объектами типа IEnumerable<T>, а другой — с объектами типа IQueryable<T>.There are two sets of LINQ standard query operators: one that operates on objects of type IEnumerable<T>, another that operates on objects of type IQueryable<T>. Методы, входящие в каждый из наборов, являются статическими членами классов Enumerable и Queryable соответственно.The methods that make up each set are static members of the Enumerable and Queryable classes, respectively. Они определяются как методы расширения типа, к которому применяются.They are defined as extension methods of the type that they operate on. Методы расширения можно вызывать, используя либо синтаксис статического метода, либо синтаксис метода экземпляра.Extension methods can be called by using either static method syntax or instance method syntax.

Кроме того, несколько стандартных методов операторов запроса работают с типами, отличными от основанных на IEnumerable<T> или IQueryable<T>.In addition, several standard query operator methods operate on types other than those based on IEnumerable<T> or IQueryable<T>. Тип Enumerable определяет два таких метода, которые работают с объектами типа IEnumerable.The Enumerable type defines two such methods that both operate on objects of type IEnumerable. Эти методы (Cast<TResult>(IEnumerable) и OfType<TResult>(IEnumerable)) позволяют выполнять запрос к непараметризованным или не являющимся универсальными коллекциям с использованием шаблона 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. Для этого создается строго типизированная коллекция объектов.They do this by creating a strongly typed collection of objects. Класс Queryable определяет два схожих метода (Cast<TResult>(IQueryable) и OfType<TResult>(IQueryable)), которые работают с объектами типа Queryable.The Queryable class defines two similar methods, Cast<TResult>(IQueryable) and OfType<TResult>(IQueryable), that operate on objects of type Queryable.

Стандартные операторы запросов имеют различное время выполнения, которое зависит от того, возвращают они одноэлементное значение или последовательность значений.The standard query operators differ in the timing of their execution, depending on whether they return a singleton value or a sequence of values. Методы, возвращающие одноэлементное значение (например, Average и Sum), выполняются одновременно.Those methods that return a singleton value (for example, Average and Sum) execute immediately. Методы, которые возвращают последовательность, откладывают выполнение запроса и возвращают перечисляемый объект.Methods that return a sequence defer the query execution and return an enumerable object.

При использовании методов, которые применяются к коллекциям, т. е. методов, которые расширяют IEnumerable<T>, возвращаемый перечисляемый объект захватывает переданные в этот метод аргументы.For 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. При перечислении этого объекта задействуется логика оператора запросов и возвращаются результаты запросов.When that object is enumerated, the logic of the query operator is employed and the query results are returned.

Напротив, методы, расширяющие IQueryable<T>, не реализуют никаких поведений запросов.In contrast, methods that extend IQueryable<T> don't implement any querying behavior. Они создают дерево выражений, представляющее выполняемый запрос.They build an expression tree that represents the query to be performed. Запрос обрабатывается объектом IQueryable<T> источника.The query processing is handled by the source IQueryable<T> object.

Вызовы методов запросов можно объединять в один запрос, в результате чего запросы могут становиться довольно сложными.Calls to query methods can be chained together in one query, which enables queries to become arbitrarily complex.

В следующем примере кода показано, как использовать стандартные операторы запросов для получения сведений о последовательности.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

Синтаксис выражений запросовQuery Expression Syntax

Некоторые из наиболее часто используемых стандартных операторов запросов имеют представление в виде ключевых слов в синтаксисе языка C# и Visual Basic, что позволяет вызывать их как часть выражения запроса.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. Дополнительные сведения о стандартных операторах запросов с выделенными ключевыми словами и соответствующим синтаксисом см. в разделе Синтаксис выражений запросов для стандартных операторов запросов (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#).

Расширение стандартных операторов запросовExtending the Standard Query Operators

Набор стандартных операторов запросов можно дополнить, создав специальные методы, соответствующие вашему целевому домену или технологии.You can augment the set of standard query operators by creating domain-specific methods that are appropriate for your target domain or technology. Кроме того, можно заменить стандартные операторы запросов на собственные реализации, предоставляющие дополнительные услуги, такие как удаленное вычисление, перевод запросов и оптимизация.You can also replace the standard query operators with your own implementations that provide additional services such as remote evaluation, query translation, and optimization. Пример см. в разделе AsEnumerable.See AsEnumerable for an example.

Следующие ссылки адресуют к статьям, содержащим дополнительные сведения о различных стандартных операторах запросов в зависимости от их функциональности.The following links take you to articles that provide additional information about the various standard query operators based on functionality.

Сортировка данных (C#)Sorting Data (C#)

Операции над множествами (C#)Set Operations (C#)

Фильтрация данных (C#)Filtering Data (C#)

Операции, использующие квантификаторы (C#)Quantifier Operations (C#)

Операции проекции (C#)Projection Operations (C#)

Секционирование данных (C#)Partitioning Data (C#)

Операции соединения (C#)Join Operations (C#)

Группирование данных (C#)Grouping Data (C#)

Операции создания (C#)Generation Operations (C#)

Операции сравнения (C#)Equality Operations (C#)

Операции с элементами (C#)Element Operations (C#)

Преобразование типов данных (C#)Converting Data Types (C#)

Операции объединения (C#)Concatenation Operations (C#)

Операции агрегирования (C#)Aggregation Operations (C#)

См. такжеSee also