Общие сведения о стандартных операторах запроса

Обновлен: Ноябрь 2007

Стандартные операторы запроса являются методами, формирующими шаблон LINQ (Language-Integrated Query). Большинство этих методов действует в последовательностях, которые представляет собой объект, тип которого реализует интерфейс IEnumerable<T> или интерфейс IQueryable<T>. Стандартные операторы запросов предоставляют возможности запроса, включая фильтрацию, проекции, статистическую обработку, сортировку и многое другое.

Существуют два набора стандартных операторов запросов LINQ: один, работающий с объектами типа IEnumerable<T>, и другой, работающий с объектами типа IQueryable<T>. Методы, составляющие каждый набор, являются статическими членами классов Enumerable и Queryable соответственно. Они определяются как методы расширения типа, с которым они работают. Это значит, что их можно вызывать либо с помощью синтаксиса статического метода, либо с помощью синтаксиса метода экземпляра.

Кроме того, несколько методов стандартных операторов запросов работают с типами, отличными от основанных на IEnumerable<T> или IQueryable<T>. Тип Enumerable определяет два таких метода, которые оба работают с объектами типа IEnumerable. Эти методы — Cast<TResult>(IEnumerable) и OfType<TResult>(IEnumerable) — позволяют использовать в шаблоне LINQ запросы к непараметризованным и неуниверсальным коллекциям. Для этого они создают строго типизированную коллекцию объектов. Класс Queryable определяет два схожих метода, — Cast<TResult>(IQueryable) и OfType<TResult>(IQueryable) — которые работают с объектами типа Queryable.

Стандартные операторы запросов отличаются по времени выполнения в зависимости от того, возвращают они одноэлементное значение или последовательность значений. Методы, возвращающие одноэлементное значение (например, Average и Sum), выполняются немедленно. Методы, возвращающие последовательность элементов, откладывают выполнение запроса и возвращают перечисляемый объект.

При использовании методов, которые работают с коллекциями в памяти (это методы, которые расширяют IEnumerable<T>), возвращаемый перечисляемый объект захватывает аргументы, переданные в метод. При перечислении объекта используется логика оператора запроса, и возвращаются результаты запроса.

Напротив, методы, расширяющие IQueryable<T>, не реализуют какое-либо поведение запроса, а строят дерево выражения, которое представляет выполняемый запрос. Обработка запроса выполняется исходным объектом IQueryable<T>.

Вызовы методов запроса могут быть объединены в один запрос, что приводит к усложнению запросов.

В следующем примере кода показано использование стандартных операторов запросов для получения сведений о последовательности.

Dim sentence As String = "the quick brown fox jumps over the lazy dog"
' Split the string into individual words to create a collection.
Dim words As String() = 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 

Синтаксис выражения запроса

Некоторые из наиболее часто используемых стандартных операторов запросов имеют представление в виде ключевых слов в синтаксисе языков C# и Visual Basic, что позволяет вызывать их как часть выраженийзапросов. Дополнительные сведения о стандартных операторах запросов, обладающих выделенными ключевыми словами, и об их синтаксисе см. в Синтаксис выражений запроса для стандартных операторов запроса.

Расширение стандартных операторов запросов

Набор стандартных операторов запросов можно дополнить путем создания методов, специфических для предметной области, которые подходят для целевой предметной области или технологии. Можно также заменить стандартные операторы запросов собственными реализациями, предоставляющими дополнительную функциональность, например удаленное выполнение, преобразование запроса и оптимизацию. Пример см. в разделе AsEnumerable<TSource>.

Связанные разделы

Следующие ссылки указывают на разделы, содержащие дополнительные сведения о различных возможностях стандартных операторов запросов.

Сортировка данных

Операции над множествами

Фильтрация данных

Операции квантификаторов

Операции проецирования

Разделение данных

Операции соединения

Группировка данных

Операции создания

Операции равенства

Операции с элементами

Преобразование типов данных

Операции объединения

Операции статистической обработки

См. также

Основные понятия

Введение в запросы LINQ

Синтаксис выражений запроса для стандартных операторов запроса

Классификация стандартных операторов запросов по способу выполнения

Методы расширения (Visual Basic)

Ссылки

Enumerable

Queryable

Методы расширения (руководство по программированию в C#)