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


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

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

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

Немедленно

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

Действие отложено

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

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

Стриминг

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

Непотоковые

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

Таблица классификации

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

Замечание

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

Оператор стандартного запроса Тип возвращаемых данных Немедленное выполнение Отложенное выполнение потоковой передачи Отложенное выполнение без потоковой обработки
Aggregate TSource X
All Boolean X
Any Boolean X
AsEnumerable IEnumerable<T> X
Average Одно числовое значение X
Cast IEnumerable<T> X
Concat IEnumerable<T> X
Contains Boolean X
Count Int32 X
DefaultIfEmpty IEnumerable<T> X
Distinct IEnumerable<T> X
ElementAt ТСорс X
ElementAtOrDefault TSource X
Empty IEnumerable<T> X
Except IEnumerable<T> X X
First TSource X
FirstOrDefault TSource X
GroupBy IEnumerable<T> X
GroupJoin IEnumerable<T> X 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 IEnumerable<T> X
OrderBy IOrderedEnumerable<TElement> X
OrderByDescending IOrderedEnumerable<TElement> X
Range IEnumerable<T> X
Repeat IEnumerable<T> X
Reverse IEnumerable<T> X
Select IEnumerable<T> X
SelectMany IEnumerable<T> X
SequenceEqual Boolean X
Single TSource X
SingleOrDefault TSource X
Skip IEnumerable<T> X
SkipWhile IEnumerable<T> X
Sum Одно числовое значение X
Take IEnumerable<T> X
TakeWhile IEnumerable<T> X
ThenBy IOrderedEnumerable<TElement> X
ThenByDescending IOrderedEnumerable<TElement> X
ToArray Массив «TSource» X
ToDictionary Dictionary<TKey,TValue> X
ToList IList<T> X
ToLookup ILookup<TKey,TElement> X
Union IEnumerable<T> X
Where IEnumerable<T> X

См. также