Классификация стандартных операторов запросов по способу выполнения
Обновлен: Ноябрь 2007
Реализации объектов LINQ методов стандартных операторов запросов выполняются одним из двух основных способов: немедленным и отложенным. Операторы запросов, использующие отложенное выполнение, можно дополнительно разделить на две категории: потоковые и непотоковые. Если пользователь имеет представление о действии разных операторов запросов, он сможет понять результаты, полученные их заданного запроса. Это особенно актуально при изменении источника данных или построении запроса поверх другого. В данном разделе представлена классификация стандартных операторов запросов по способу выполнения.
Способ выполнения
Немедленный
Немедленное выполнение означает чтение источника данных и выполнение операции в той точке кода, где объявлен запрос. Все стандартные операторы запросов, возвращающие один неперечислимый результат, выполняются немедленно.
Отложенный
Отложенное выполнение означает, что операция не выполнена в той точке кода, где объявлен запрос. Она выполняется только после перечисления переменной запроса, например с помощью оператора foreach (For Each в Visual Basic). Это значит, что результаты выполнения запроса зависят от содержимого источника данных при осуществлении запроса, а не при его определении. Если переменная запроса перечисляется многократно, каждый раз могут возвращаться разные результаты. Почти все стандартные операторы запросов, имеющие возвращаемый тип IEnumerable<T> или IOrderedEnumerable<TElement>, выполняются отложенным способом.
Операторы запросов, использующие отложенное выполнение, можно дополнительно разделить на две категории: потоковые и непотоковые.
Потоковые операторы
Потоковые операторы не считывают все исходные данные до получения элементов. Во время выполнения потоковый оператор осуществляет свои действия в каждом исходном элементе по мере считывания и при необходимости выдает элемент. Потоковый оператор продолжает считывание исходных элементов до вывода результирующего элемента. Это значит, что для получения одного итогового элемента может быть считано несколько исходных элементов.
Непотоковые операторы
Непотоковые операторы должны считывать все исходные данные до получения результирующего элемента. В эту категорию входят операции по сортировке и группировке. Во время выполнения непотоковые операторы запросов считывают все исходные данные, помещают их в структуру данных, осуществляют действия и выдают итоговые элементы.
Классификационная таблица
В следующей таблице представлена классификация всех методов стандартных операторов запросов по способу выполнения.
Примечание. |
---|
Если оператор помечен в двух столбцах, в операции участвует две входные последовательности, каждая из которых оценивается по-своему. В таких случаях отложенным потоковым способом всегда выполняется первая последовательность в параметре. |
Стандартный оператор запроса |
Возвращаемый тип |
Немедленное выполнение |
Отложенное потоковое выполнение |
Отложенное непотоковое выполнение |
---|---|---|---|---|
TSource |
X |
|
|
|
X |
|
|
||
X |
|
|
||
X |
|
|||
Единичное числовое значение |
X |
|
|
|
|
X |
|
||
|
X |
|
||
X |
|
|
||
X |
|
|
||
|
X |
|
||
|
X |
|
||
TSource |
X |
|
|
|
TSource |
X |
|
|
|
X |
|
|
||
X |
X |
|||
TSource |
X |
|
|
|
TSource |
X |
|
|
|
|
|
X |
||
X |
X |
|||
X |
X |
|||
X |
X |
|||
TSource |
X |
|
|
|
TSource |
X |
|
|
|
X |
|
|
||
Единичное числовое значение, TSource или TResult |
X |
|
|
|
Единичное числовое значение, TSource или TResult |
X |
|
|
|
|
X |
|
||
|
|
X |
||
|
|
X |
||
|
X |
|
||
|
X |
|
||
|
|
X |
||
|
X |
|
||
|
X |
|
||
X |
|
|
||
TSource |
X |
|
|
|
TSource |
X |
|
|
|
|
X |
|
||
|
X |
|
||
Единичное числовое значение |
X |
|
|
|
|
X |
|
||
|
X |
|
||
|
|
X |
||
|
|
X |
||
Массив TSource |
X |
|
|
|
X |
|
|
||
X |
|
|
||
X |
|
|
||
|
X |
|
||
|
X |
|
См. также
Основные понятия
Общие сведения о стандартных операторах запроса
Синтаксис выражений запроса для стандартных операторов запроса