Программирование >>  Программирование с использованием ajax 

1 ... 270 271 272 [ 273 ] 274 275 276 ... 396


Это произведет следующий вывод:

Mumbai

Karachi

Delhi

Seoul

Istanbul

Shanghai

Jakarta

Tokyo

Tehran

Beijing

Можно даже трансформировать данные в запросе, добавив выражение в select, как показано ниже:

select п + 1 для числового типа данных, или

select S.ToUpperО

для запроса строкового типа данных. Однако, в отличие от SQL, LINQ не допускает множественные поля в конструкции select. Это значит, что строка

select с.City, с.Country, с.Sales

Вызовет ошибку компиляции (ожидается точка с запятой), потому что select принимает только один элемент в своем списке параметров.

Вместо этого в LINQ на лету создается новый объект в конструкции select для хранения результатов, которые нужны для запроса. Сделаем это в следующем практическом занятии.

Практическое занятие Проекция! создэние НОВЫХ объектов

В запросах

Выполните следующие шаги для создания примера в Visual С# 2008.

1. Модифицируйте пример 26-7-QueryComplexObjects или создайте новое консольное приложение по имени 26-8-ProjectionCreateNewObjects в каталоге C:\BegVCSharp\Chapter26.

2. Если вы выберете создание нового проекта, скопируйте код для создания класса Customer и инициализацию списка заказчиков из примера 26-7-QueryComplex Objects; этот код в точности повторяет ранее использованный.

3. В методе Main() выполните инициализацию списка customers, введите (или модифицируйте) запрос и цикл обработки результатов, как показано ниже:

var queryResults =

from с in customers

where с.Region == North America

select new { c.City, c.Country, c.Sales }

foreach (var item in queryResults) {

Console.WriteLine(item);

4. Остальной код в методе Main () такой же, как и в предыдущих примерах.



5. Откомпилируйте и запустите программу. Вы увидите выбранные поля списка заказчиков из Северной Америки, перечисленные следующим образом:

{ City = New York, Country = USA, Sales = 9999 } { City = Mexico City, Country = Mexico, Sales = 2000 } { City = Los Angeles, Country = USA, Sales = 5000 } Программа завершена, нажмите Enter для продолжения:

Описание полученных результатов

Класс Customer и список customers - те же, что и в предыдущем примере. В запросе вы изменили запрошенный регион на Северную Америку - просто для разнообразия. Интересное изменение, касающееся проекции, заключено в параметре конструкции select:

select new { c.City, с.Country, с.Sales }

Непосредственно в конструкции select используется синтаксис анонимного типа для создания нового объекта безымянного типа, имеющего свойства, City, Country и Sales. Конструкция select создает новый объект. Таким образом, только эти три свойства дублируются и обрабатываются на разных стадиях обработки запроса.

При печати результатов запроса используется тот же обобщенный код цикла foreach, который применялся в предыдущих примерах, за исключением запроса Customer:

foreach (var item in queryResults) {

Console.WriteLine(item);

Этот код полностью обобщен; компилятор выводит тип результата запроса и вызывает правильные методы для анонимного типа без необходимости явного кодирования чего бы то ни было. Вам даже не нужно представлять переопределение ToString (), поскольку компилятор предоставляет реализацию ToString () по умолчанию, которая печатает имена свойств и значений в манере, подобной инициализации объекта.

Проекция: синтаксис методов

Версия в синтаксисе методов запроса проекции создается подстановкой вызова метода LINQ по имени Select () наряду с другими вызываемыми методами LINQ. Например, тот же результат запроса можно получить, если добавить вызов метода Select () к вызову Where (), как показано ниже:

var queryResults = customers.Where (с => с.Region == North America )

.Select(c => new { c.City, c.Country, c.Sales });

Хотя конструкция select обязательна в синтаксисе запроса, вы еще не видели ранее вызова метода Select (), потому что он не обязателен в синтаксисе метода LINQ, если только не выполняется проекция (изменение типа результирующего набора по сравнению с исходным запрашиваемым типом).

Порядок вызовов методов не фиксирован, потому что все типы возврата методов LINQ реализуют интерфейс lEnumerable - можно вызвать Select () на результате Where () и наоборот. Однако порядок может быть важен, в зависимости от специфики запроса. Например, можно было бы поменять порядок вызовов Select () и Where () следующим образом:

var queryResults = customers.Select(с => new { c.City, с.Country, с.Sales })

.Where(с => с.Region == North America );



Свойство Region не включено в анонимный тип { c.City, с.Country, с.Sales }, созданный проекцией Select (), поэтому программа приведет к ошибке компиляции в методе Where (), указывающей на то, что анонимный тип не содержит определения

Region.

Однако если бы метод Where () был ограничен данными, основанными на поле, которое включено в анонимный тип, таким как City, то проблем бы не было. Например, следующий запрос компилируется и выполняется без проблем:

var queryResults = customers.Select(с => new (c.City, с.Country, с.Sales })

.Where (с => c.City == New York );

Запрос Select Distinct

Другой тип запросов, который узнают те, кто знаком с языком запросов данных SQL - запрос SELECT DISTINCT, в котором выполняется поиск уникальных значений в данных, т.е. значений, которые не повторяются. Потребность в этом возникает очень часто при работе с запросами.

Предположим, что нужно извлечь список регионов из данных заказчиков, которые применялись в предыдущих примерах. В используемых данных нет отдельного списка регионов, поэтому необходимо получить уникальный, не повторяющийся список регионов из списка заказчиков. LINQ предоставляет метод Distinct (), который облегчает выполнение задачи нахождения данных подобного рода. Этот метод используется его в следующем практическом занятии.

Практическое занятм Проекция: запрос Select Distinct

Выполните следующие шаги для создания примера в Visual С# 2008.

1. Модифицируйте предыдущий пример, 26-8-ProjectionCreateNewObjects, или создайте новое консольное приложение по имени 26-9-SelectDistinctQuery в каталоге C:\BegVCSharp\Chapter26.

2. Скопируйте код создания класса Customer и инициализации списка customers

(List<Customer> customers) из примера 26-7-QueryComplesObjects; код тот же самый.

3. В методе Main () вслед за инициализацией списка заказчиков введите (или модифицируемте) запрос следующим образом:

var queryResults = customers.Select (с => с.Region).Distinct ();

4. Остальной код в методе Main () оставьте без изменений, как в предыдущем примере.

5. Откомпилируйте и выполните программу. Вы увидите уникальный список регионов, в которых находятся заказчики:

North America Asia

South America

Europe

Africa

Программа завершена, нажмите Enter для продолжения:



1 ... 270 271 272 [ 273 ] 274 275 276 ... 396

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика