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

Стандартные операторы запроса являются методами, формирующими шаблон 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 = "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 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

См. также

Ссылки

Enumerable

Queryable

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

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

Введение в запросы LINQ (C#)

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

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

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