Поделиться через


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

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

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

Bb882641.collapse_all(ru-ru,VS.110).gifНемедленный

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

Bb882641.collapse_all(ru-ru,VS.110).gifОтложенный

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

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

Bb882641.collapse_all(ru-ru,VS.110).gifПотоковые операторы

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

Bb882641.collapse_all(ru-ru,VS.110).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

 

См. также

Ссылки

Enumerable

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

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

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

LINQ to Objects