Общие сведения о стандартных операторах запроса (C#)
Стандартные операторы запросов — это методы, формирующие шаблон 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)), которые работают с объектами типа IQueryable.
Стандартные операторы запросов имеют различное время выполнения, которое зависит от того, возвращают они одноэлементное значение или последовательность значений. Методы, возвращающие одноэлементное значение (например, Average и Sum), выполняются одновременно. Методы, которые возвращают последовательность, откладывают выполнение запроса и возвращают перечисляемый объект.
При использовании методов, которые применяются к коллекциям, т. е. методов, которые расширяют IEnumerable<T>, возвращаемый перечисляемый объект захватывает переданные в этот метод аргументы. При перечислении этого объекта задействуется логика оператора запросов и возвращаются результаты запросов.
Напротив, методы, расширяющие IQueryable<T>, не реализуют никаких поведений запросов. Они создают дерево выражений, представляющее выполняемый запрос. Запрос обрабатывается объектом IQueryable<T> источника.
Вызовы методов запросов можно объединять в один запрос, в результате чего запросы могут становиться довольно сложными.
В следующем примере кода показано, как использовать стандартные операторы запросов для получения сведений о последовательности.
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, что позволяет вызывать их как часть выражениязапроса. Дополнительные сведения о стандартных операторах запросов с выделенными ключевыми словами и соответствующим синтаксисом см. в разделе Синтаксис выражений запросов для стандартных операторов запросов (C#).
Расширение стандартных операторов запросов
Набор стандартных операторов запросов можно дополнить, создав специальные методы, соответствующие вашему целевому домену или технологии. Кроме того, можно заменить стандартные операторы запросов на собственные реализации, предоставляющие дополнительные услуги, такие как удаленное вычисление, перевод запросов и оптимизация. Пример см. в разделе AsEnumerable.
Связанные разделы
Следующие ссылки адресуют к статьям, содержащим дополнительные сведения о различных стандартных операторах запросов в зависимости от их функциональности.
Операции, использующие квантификаторы (C#)
Преобразование типов данных (C#)