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

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

Реализации объектов LINQ методов стандартных операторов запросов выполняются одним из двух основных способов: немедленным и отложенным. Операторы запросов, использующие отложенное выполнение, можно дополнительно разделить на две категории: потоковые и непотоковые. Если пользователь имеет представление о действии разных операторов запросов, он сможет понять результаты, полученные их заданного запроса. Это особенно актуально при изменении источника данных или построении запроса поверх другого. В данном разделе представлена классификация стандартных операторов запросов по способу выполнения.

Способ выполнения

Немедленный

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

Отложенный

Отложенное выполнение означает, что операция не выполнена в той точке кода, где объявлен запрос. Она выполняется только после перечисления переменной запроса, например с помощью оператора foreach (For Each в Visual Basic). Это значит, что результаты выполнения запроса зависят от содержимого источника данных при осуществлении запроса, а не при его определении. Если переменная запроса перечисляется многократно, каждый раз могут возвращаться разные результаты. Почти все стандартные операторы запросов, имеющие возвращаемый тип IEnumerable<T> или IOrderedEnumerable<TElement>, выполняются отложенным способом.

Операторы запросов, использующие отложенное выполнение, можно дополнительно разделить на две категории: потоковые и непотоковые.

Потоковые операторы

Потоковые операторы не считывают все исходные данные до получения элементов. Во время выполнения потоковый оператор осуществляет свои действия в каждом исходном элементе по мере считывания и при необходимости выдает элемент. Потоковый оператор продолжает считывание исходных элементов до вывода результирующего элемента. Это значит, что для получения одного итогового элемента может быть считано несколько исходных элементов.

Непотоковые операторы

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

Классификационная таблица

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

Bb882641.alert_note(ru-ru,VS.90).gifПримечание.

Если оператор помечен в двух столбцах, в операции участвует две входные последовательности, каждая из которых оценивается по-своему. В таких случаях отложенным потоковым способом всегда выполняется первая последовательность в параметре.

Стандартный оператор запроса

Возвращаемый тип

Немедленное выполнение

Отложенное потоковое выполнение

Отложенное непотоковое выполнение

Aggregate

TSource

X

 

 

All<TSource>

Boolean

X

 

 

Any

Boolean

X

 

 

AsEnumerable<TSource>

IEnumerable<T>

X

 

Average

Единичное числовое значение

X

 

 

Cast<TResult>

IEnumerable<T>

 

X

 

Concat<TSource>

IEnumerable<T>

 

X

 

Contains

Boolean

X

 

 

Count

Int32

X

 

 

DefaultIfEmpty

IEnumerable<T>

 

X

 

Distinct

IEnumerable<T>

 

X

 

ElementAt<TSource>

TSource

X

 

 

ElementAtOrDefault<TSource>

TSource

X

 

 

Empty<TResult>

IEnumerable<T>

X

 

 

Except

IEnumerable<T>

X

 X

First

TSource

X

 

 

FirstOrDefault

TSource

X

 

 

GroupBy

IEnumerable<T>

 

 

X

GroupJoin

IEnumerable<T>

X

Intersect

IEnumerable<T>

X

X

Join

IEnumerable<T>

X

X

Last

TSource

X

 

 

LastOrDefault

TSource

X

 

 

LongCount

Int64

X

 

 

Max

Единичное числовое значение, TSource или TResult

X

 

 

Min

Единичное числовое значение, TSource или TResult

X

 

 

OfType<TResult>

IEnumerable<T>

 

X

 

OrderBy

IOrderedEnumerable<TElement>

 

 

X

OrderByDescending

IOrderedEnumerable<TElement>

 

 

X

Range

IEnumerable<T>

 

X

 

Repeat<TResult>

IEnumerable<T>

 

X

 

Reverse<TSource>

IEnumerable<T>

 

 

X

Select

IEnumerable<T>

 

X

 

SelectMany

IEnumerable<T>

 

X

 

SequenceEqual

Boolean

X

 

 

Single

TSource

X

 

 

SingleOrDefault

TSource

X

 

 

Skip<TSource>

IEnumerable<T>

 

X

 

SkipWhile

IEnumerable<T>

 

X

 

Sum

Единичное числовое значение

X

 

 

Take<TSource>

IEnumerable<T>

 

X

 

TakeWhile

IEnumerable<T>

 

X

 

ThenBy

IOrderedEnumerable<TElement>

 

 

X

ThenByDescending

IOrderedEnumerable<TElement>

 

 

X

ToArray<TSource>

Массив TSource

X

 

 

ToDictionary

Dictionary<TKey, TValue>

X

 

 

ToList<TSource>

IList<T>

X

 

 

ToLookup

ILookup<TKey, TElement>

X

 

 

Union

IEnumerable<T>

 

X

 

Where

IEnumerable<T>

 

X

 

См. также

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

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

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

LINQ to Objects

Ссылки

Enumerable