Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Реализации стандартных методов оператора запроса LINQ to Objects выполняются одним из двух основных способов: немедленный или отложенный. Операторы запросов, которые используют отложенное выполнение, можно также разделить на две категории: потоковые и непотоковые. Если вы знаете, как выполняются различные операторы запросов, это может помочь вам понять результаты, полученные из данного запроса. Это особенно верно, если источник данных изменяется или создается запрос на основе другого запроса. В этом разделе классифицируются стандартные операторы запросов в соответствии с их способом выполнения.
Способы выполнения
Немедленно
Немедленное выполнение означает, что источник данных считывается и операция выполняется в точке кода, в котором объявлен запрос. Все стандартные операторы запросов, возвращающие единый, не перечисляемый результат, выполняются немедленно.
Действие отложено
Отложенное выполнение означает, что операция не выполняется в точке кода, в котором объявлен запрос. Операция выполняется только при перечислении переменной запроса, например с помощью инструкции For Each
. Это означает, что результаты выполнения запроса зависят от содержимого источника данных при выполнении запроса, а не при определении запроса. Если переменная запроса перечисляется несколько раз, результаты могут отличаться каждый раз. Почти все стандартные операторы запросов, тип возвращаемого результата которых IEnumerable<T> или IOrderedEnumerable<TElement>, выполняются в отложенном режиме.
Операторы запросов, использующие отложенное выполнение, можно их дополнительно классифицировать как потоковые или непотоковые.
Стриминг
Операторы потоковой передачи не должны считывать все исходные данные, прежде чем они получают элементы. Во время выполнения оператор потоковой передачи выполняет свою операцию над каждым исходным элементом по мере считывания и возвращает элемент, если это уместно. Оператор потоковой передачи продолжает считывать исходные элементы до тех пор, пока не будет создан результирующий элемент. Это означает, что для получения одного результирующего элемента могут быть прочитаны несколько исходных элементов.
Непотоковые
Операторы без потоковой передачи должны считывать все исходные данные, прежде чем они смогут получить элемент результата. Такие операции, как сортировка или группирование, попадают в эту категорию. Во время выполнения операторы запросов без потоковой передачи считывают все исходные данные, помещают его в структуру данных, выполняют операцию и дают полученные элементы.
Таблица классификации
В следующей таблице классифицируется каждый стандартный метод оператора запроса в соответствии с методом выполнения.
Замечание
Если оператор помечается двумя столбцами, в операции участвуют две входные последовательности, и каждая последовательность оценивается по-разному. В таких случаях это всегда первая последовательность в списке параметров, которая оценивается в отложенном, потоковом режиме.