Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






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






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

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

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

using System;

using System.Linq;

 

class SimpQuery {

static void Main() {

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

 

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

// формирования простого запроса.

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

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

 

// Выполнить запрос и вывести его результаты.

foreachfint i in posNums) Console.Write(i + " ");

 

Console.WriteLine();

}

}

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

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

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

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

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

Формально метод 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", " hsNameI.tv"

};

 

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

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

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

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

 

// Выполнить запрос и вывести его результаты.

foreach(var sites in webAddrs) {

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

" по имени домена " + sites.Key);

 

foreach(var site in sites)

Console.WriteLine(" " + site);

 

Console.WriteLine();

}

}

}

Эта версия программы дает такой же результат, как и предыдущая. Единственное отличие между ними заключается в том, как формируется запрос. В данной версии для этой цели используются методы запроса.

Рассмотрим другой пример. Но сначала приведем еще раз запрос из представлен­ ного ранее примера применения оператора join.

var inStockList = from item in items

join entry in statusList

on item.ItemNumber equals entry.ItemNumber

select new Temp(item.Name, entry.InStock);

По этому запросу формируется последовательность, состоящая из объектов, инкап­ сулирующих наименование товара и состояние его запасов на складе. Вся эта инфор­ мация получается путем объединения двух источников данных: items и statusList. Ниже приведен переделанный вариант данного запроса, в котором вместо синтаксиса, предусмотренного в C# для запросов, используется метод запроса Join().

// Использовать метод запроса Join() для составления списка

// наименований товаров и состояния их запасов на складе.

var inStockList = items.Join(statusList,

k1 => k1.ItemNumber,

k2 => k2.ItemNumber,

(k1, k2) => new Temp(k1.Name, k2.InStock));

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

var inStockList = items.Join(statusList,

k1 => k1.ItemNumber,

k2 => k2.ItemNumber,

(k1, k2) => new { k1.Name, k2.InStock});






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.