Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Разработка приложений баз данных (Visual Studio 2008).docx
Скачиваний:
143
Добавлен:
26.03.2016
Размер:
1.01 Mб
Скачать

Выполнение запроса Отложенное выполнение

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

C#

// Query execution.

foreach (int num in numQuery)

{

Console.Write("{0,1} ", num);

}

Оператор foreachявляется также местом, где извлекаются результаты запроса. Например, в предыдущем запросе переменная итерацииnumсодержит каждое (по очереди) значение в возвращаемой последовательности.

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

Принудительное немедленное выполнение

Запросы, выполняющие статистические функции над диапазоном исходных элементов, должны сначала выполнить итерацию этих элементов. Примерами таких запросов являются Count,Max,AverageиFirst. Они выполняются без явного оператораforeach, поскольку сам запрос должен использовать foreach для возвращения результата. Обратите внимание, что такой тип запросов возвращает одиночное значение, а не коллекциюIEnumerable. Следующий запрос возвращает количество четных чисел в исходном массиве.

C#

var evenNumQuery =

from num in numbers

where (num % 2) == 0

select num;

int evenNumCount = evenNumQuery.Count();

Чтобы принудительно вызвать немедленное выполнение любого запроса и кэшировать его результаты, можно вызвать метод ToList<TSource>илиToArray<TSource>.

C#

List<int> numQuery2 =

(from num in numbers

where (num % 2) == 0

select num).ToList();

// or like this:

// numQuery3 is still an int[]

var numQuery3 =

(from num in numbers

where (num % 2) == 0

select num).ToArray();

Можно также принудительно выполнить запрос, поместив цикл foreach сразу после выражения запроса. Однако вызов ToListилиToArrayтакже кэширует все данные в одной коллекции объектов.

Создание запросов linq на языке c#

В этом разделе рассматриваются три способа создания запросов LINQ на языке C#.

  1. Использование синтаксиса запроса.

  2. Использование синтаксиса метода.

  3. Использование сочетания синтаксиса запроса и синтаксиса метода.

В следующем примере демонстрируются простые запросы LINQ при использовании каждого из перечисленных выше синтаксисов. Общее правило таково: следует использовать (1) всегда, когда это возможно; (2) и (3) при необходимости.

Примечание

Эти запросы работают с простыми коллекциями в памяти, однако базовый синтаксис идентичен синтаксису, использованному в LINQ to SQL и LINQ to XML.

Синтаксис запроса

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

C#

// Query #1.

List<int> numbers = new List<int>() { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };

// The query variable can also be implicitly typed by using var

IEnumerable<int> filteringQuery =

from num in numbers

where num < 3 || num > 7

select num;

// Query #2.

IEnumerable<int> orderingQuery =

from num in numbers

where num < 3 || num > 7

orderby num ascending

select num;

// Query #3.

string[] groupingQuery = { "carrots", "cabbage", "broccoli", "beans", "barley" };

IEnumerable<IGrouping<char, string>> queryFoodGroups =

from item in groupingQuery

group item by item[0];

Обратите внимание, что тип запросов — IEnumerable<T>. Все эти запросы можно написать с помощью var, как показано в примере ниже.

var query = from num in numbers...

В каждом из приведенных выше примеров фактическое выполнение запроса откладывается до использования переменной запроса в операторе foreach.