Книга: 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 + " ");
}

Оглавление книги


Генерация: 1.114. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз