Общие сведения о стандартных операторах запроса
Стандартные операторы запроса являются методами, формирующими шаблон LINQ.Большинство этих методов действует в последовательностях, которые представляет собой объект, тип которого реализует интерфейс 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>.
Связанные разделы
Следующие ссылки указывают на разделы, содержащие дополнительные сведения о различных возможностях стандартных операторов запросов.
Операции статистической обработки
См. также
Ссылки
Методы расширения (Руководство по программированию в C#)
Основные понятия
Синтаксис выражений запроса для стандартных операторов запроса
Классификация стандартных операторов запросов по способу выполнения