Выбрать главу

Формирование запросов с помощью методов запроса

Используя методы запроса одновременно с лямбда-выражениями, можно формировать запросы, вообще не пользуясь синтаксисом, предусмотренным в C# для запросов. Вместо этого достаточно вызвать соответствующие методы запроса. Обратимся сначала к простому примеру. Он представляет собой вариант первого примера программы из этой главы, переделанный с целью продемонстрировать применение методов запроса Where () и Select () вместо соответствующих операторов.

// Использовать методы запроса для формирования простого запроса.

// Это переделанный вариант первого примера программы из настоящей главы.

using System; using System.Linq;

class SimpQuery {

static void Main() {

int[] nums = { 1, -2, 3, О, -4, 5 };

// Использовать методы Where() и Select () для // формирования простого запроса.

var posNums = nums.Where(n => n > 0).Select(r => r);

Console.Write("Положительные значения из массива nums: ");

// Выполнить запрос и вывести его результаты, foreach(int i in posNums) Console.Write(i + " ") ;

Console.WriteLine ();

}

}

Эта версия программы дает такой же результат, как и исходная.

Положительные значения из массива nums: 13 5

Обратите особое внимание в данной программе на следующую строку кода.

var posNums = nums.Where(n => n > 0).Select(r => r);

В этой строке кода формируется запрос, сохраняемый в переменной posNums. По этому запросу, в свою очередь, формируется последовательность положительных значений, извлекаемых из массива nums. Для этой цели служит метод Where (), отбирающий запрашиваемые значения, а также метод Select (), избирательно формирующий из этих значений окончательный результат. Метод Where () может быть вызван для массива nums, поскольку во всех массивах реализуется интерфейс IEnumerable<T>, поддерживающий методы расширения запроса.

Формально метод Select () в рассматриваемом здесь примере не нужен, поскольку это простой запрос. Ведь последовательность, возвращаемая методом Where (), уже содержит конечный результат. Но окончательный выбор можно сделать и по более сложному критерию, как это было показано ранее на примерах использования синтаксиса запросов. Так, по приведенному ниже запросу из массива nums возвращаются положительные значения, увеличенные на порядок величины.

var posNums = nums.Where(n => n > 0) .Select (r => r * 10);

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

var posNums = nums.Where(n => n > 0).OrderByDescending(j => j);

где выражение j => j обозначает, что упорядочение зависит от входного параметра, который является элементом данных из последовательности, получаемой из метода Where().

В приведенном ниже примере демонстрируется применение метода запроса GroupBy (). Это измененный вариант представленного ранее примера.

// Продемонстрировать применение метода запроса GroupBy().

// Это переработанный вариант примера, представленного ранее // для демонстрации синтаксиса запросов.

using System; using System.Linq;

class GroupByDemo { static void Main() {

string[] websites = {

"hsNameA.com", "hsNameB.net", "hsNameC.net",

’"hsNameD.com", "hsNameE.org", "hsNameF.org",

"hsNameG.tv", "hsNameH.net", "hsNamel.tv"

};

// Использовать методы запроса для группирования

// веб-сайтов по имени домена самого верхнего уровня.

var webAddrs = websites.Where(w => w.LastlndexOf)    !=    1).

GroupBy(x => x.Substring(x.LastlndexOf(".", x.Length)));

// Выполнить запрос и вывести его результаты, foreach(var sites in webAddrs) {

Console.WriteLine("Веб-сайты, сгруппированные " +

"по имени домена " + sites.Key); foreach(var site in sites)

Console.WriteLine ("    "    +    site);

Console.WriteLine();

}