Книга: C# 4.0: полное руководство
Режимы выполнения запросов: отложенный и немедленный
Режимы выполнения запросов: отложенный и немедленный
В LINQ запросы выполняются в двух разных режимах: немедленном и отложенном. Как пояснялось ранее в этой главе, при формировании запроса определяется ряд правил, которые не выполняются вплоть до оператора цикла foreach
. Это так называемое отложенное выполнение.
Но если используются методы расширения, дающие результат, отличающийся от последовательности, то запрос должен быть выполнен для получения этого результата. Рассмотрим, например, метод расширения Count()
. Для того чтобы этот метод возвратил количество элементов в последовательности, необходимо выполнить запрос, и это делается автоматически при вызове метода Count()
. В этом случае имеет место немедленное выполнение, когда запрос выполняется автоматически для получения требуемого результата. Таким образом, запрос все равно выполняется, даже если он не используется явно в цикле foreach
.
Ниже приведен простой пример программы для получения количества положительных элементов, содержащихся в последовательности.
// Использовать режим немедленного выполнения запроса
using System;
using System.Linq;
class ImmediateExec {
static void Main() {
int[] nums = { 1, -2, 3, 0, -4, 5 };
// Сформировать запрос на получение количества
// положительных значений в массиве nums.
int len = (from n in nums where n > 0 select n).Count();
Console.WriteLine("Количество положительных значений в массиве nums: " + len) ;
}
}
Эта программа дает следующий результат.
Количество положительных значений в массиве nums: 3
Обратите внимание на то, что цикл foreach
не указан в данной программе явным образом. Вместо этого запрос выполняется автоматически благодаря вызову метода расширения Count()
.
Любопытно, что запрос из приведенной выше программы можно было бы сформировать и следующим образом.
var posNums = from n in nums where n > 0 select n;
int len = posNums.Count(); // запрос выполняется здесь
В данном случае метод Count()
вызывается для переменной запроса. И в этот момент запрос выполняется для получения подсчитанного количества.
К числу других методов расширения, вызывающих немедленное выполнение запроса, относятся методы ТоArray()
и ToList()
. Оба этих метода расширения определены в классе Enumerable
. Метод ToAtray()
возвращает результаты запроса в массиве, а метод ToList()
— результаты запроса в форме коллекции List
. (Подробнее о коллекциях речь пойдет в главе 25.) В обоих случаях для получения результатов выполняется запрос. Например, в следующем фрагменте кода сначала получается массив результатов, сформированных по приведенному выше запросу в переменной posNums
, а затем эти результаты выводятся на экран.
int[] pnums = posNum.ToArray(); // запрос выполняется здесь
foreach(int i in pnums)
Console.Write(i + " ");
}
- Основы LINQ
- Общая форма запроса
- Отбор запрашиваемых значений с помощью оператора where
- Сортировка результатов запроса с помощью оператора orderby
- Подробное рассмотрение оператора select
- Применение вложенных операторов from
- Группирование результатов с помощью оператора group
- Продолжение запроса с помощью оператора into
- Применение оператора let для создания временной переменной в запросе
- Объединение двух последовательностей с помощью оператора join
- Анонимные типы
- Создание группового объединения
- Методы запроса
- Режимы выполнения запросов: отложенный и немедленный
- Деревья выражений
- Методы расширения
- PLINQ
- Права для выполнения резервного копирования
- Улучшенный оптимизатор запросов
- 8.5.3. Режимы энергосбережения
- Упражнения для самостоятельного выполнения
- Асинхронный сервер и отмена выполняющихся запросов
- 1.4.1. Кодирование во время выполнения
- 1. Оператор Select – базовый оператор языка структурированных запросов
- 2. Унарные операции на языке структурированных запросов
- 3. Бинарные операции на языке структурированных запросов
- 4. Использование подзапросов
- 4. Режимы работы экспертных систем
- 1.1 Режимы ядра и пользователя Windows