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

1 ... 272 273 274 [ 275 ] 276 277 278 ... 396


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

orderby с.Region, с.Country, c.City

Проще некуда, не правда ли? Кажется несколько не интуитивным, что простой список полей допускается в конструкции orderby, но не допускается в конструкции select, но так уж работает LINQ. Это имеет смысл, если вы поймете, что конструкция select создает новый объект, а конструкция orderby по определению оперирует полями.

Можно добавить ключевое слово descending к любому из перечисленных полей, чтобы изменить порядок сортировки для этого поля. Например, чтобы упорядочить этот запрос по возрастанию региона, но по убыванию страны, просто добавьте в список descending после country:

orderby с.Region, с.Country descending, c.City После этого вы увидите следующее:

Africa, Country = Nigeria, City = Lagos } Africa, Country = Egypt, City = Cairo } Asia, Country = Turkey, City = Istanbul } Asia, Country = Pakistan, City = Karachi } Asia, Country = Korea, City = Seoul } Asia, Country = Japan, City = Tokyo } Asia, Country = Iran, City = Tehran } Asia, Country = Indonesia, City = Jakarta } Asia, Country = India, City = Delhi } Asia, Country = India, City = Mumbai } Asia, Country = China, City = Beijing } Asia, Country = China, City = Shanghai } Europe, Country = UK, City = London } Europe, Country = Russia, City = Moscow } North America, Country = USA, City = Los Angeles } North America, Country = USA, City = New York } North America, Country = Mexico, City = Mexico City } South America, Country = Peru, City = Lima } South America, Country = Colombia, City = Bogot б } South America, Country = Brazil, City = Sao Paulo } Программа завершена, нажмите Enter для продолжения:

Обратите внимание, что города Индии и Китая по-прежнему расположены в порядке возрастания, в то время как порядок стран изменился на противоположный.

Синтаксис методов многоуровневого упорядочивания: ThenBy

Если заглянуть за кулисы многоуровневого упорядочивания, использующего синтаксис методов, ThenBy () и OrderBy (), то там все несколько сложнее.

Например, вы получите тот же результат, как и в предыдущем примере, если напишете следующий код:

var queryResults = customers.OrderBy (с => с.Region) .ThenBy(с => с.Country) .ThenBy(c => c.City)

.Select(с => new { c.ID, c.Region, c.Country, c.City }) ;

ID =

Region

ID =

Region

ID =

Region

ID =

Region

ID =

Region

ID =

Region

ID =

Region

ID =

Region

ID =

Region

ID =

Region

ID =

Region

ID =

Region

ID =

Region

ID =

Region

ID =

Region

ID =

Region

ID =

Region

ID =

Region

ID =

Region

ID =

Region



Теперь более очевидно, почему список из многих полей допускается в конструкции orderby в синтаксисе запросов; вы можете видеть здесь, что он транслируется в серию вызовов метода ThenBy () для каждого поля. Порядок записи вызовов важен: вы должны начать с OrderBy (), потому что метод ThenBy () допускается только на интерфейсе lOrderedEnumerable, возвращаемом OrderBy (). Однако метод ThenBy () может быть соединен с другим методом ThenBy () столько раз, сколько нужно. Это тот случай, когда синтаксис запросов явно легче написать, чем синтаксис методов.

Убывающий порядок специфицируется вызовом либо OrderByDescending () на первом поле, подлежащем сортировке в убывающем порядке, либо вызовом ThenByDescending (), если любое из остальных полей должно быть отсортировано в убывающем порядке. Чтобы отсортировать страны в порядке убывания, как в этом примере, запрос в синтаксисе методов должен выглядеть следующим образом:

var queryResults = customers.OrderBy(с => с.Region)

.ThenByDescending(с => с.Country) .ThenBy(c => c.City)

.Select(с => new { c.ID, c.Region, c.Country, c.City }) ;

Групповые запросы

Групповой запрос делит данные на группы и позволяет сортировать, вычислять агрегатные значения и сравнивать группы. Это часто наиболее интересные запросы в контексте бизнеса (те, что действительно используются для принятия решений). Например, вы можете пожелать сравнить продажи по стране и региону, чтобы решить, стоит ли открывать новый магазин или нанимать дополнительный персонал. Сделаем это в следующем практическом занятии.

Групповой запрос

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

1. Создайте новое консольное приложение по имени 26-12-GroupQuery в каталоге C:\BegVCSharp\Chapter26.

2. Создайте класс Customer и инициализируйте список customers (List<Customer> customers), как показано в примере 26-7-QueryComplexObjects; этот код в точности совпадает с предыдущим примером.

3. В методе Main () вслед за инициализацией списка customers введите два запроса:

var queryResults =

from с in customers

group с by с.Region into eg

select new { TotalSales = cg.Sum(c => c.Sales), Region = eg.Key }

var orderedResults =

from eg in queryResults

orderby eg.TotalSales descending

select eg

4. Продолжая метод Main (), добавьте следующий оператор print и цикл обработки foreach:



Console.WriteLine( BceroXt: По\ппродаж\t: региону\п------\t

foreach (var item in orderedResults)

Console.WriteLine(item.TotalSales + \t: + item.Region);

5. Цикл обработки результатов и остальной код метода Main () такой же, как и в предыдущих примерах. Откомпилируйте и выполните программу. Вот результат group:

Всего : По продаж : региону

52997 : Asia

16999 : North America

12444 : Europe

8558 : South America

7000 : Africa

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

Класс Customer и инициализация списка customers такие же, как и в предыдущих примерах.

Данные в групповом запросе группируются по ключевому полю - полю, для которого все члены каждой группы разделяют общее значение. В этом примере ключевым полем является Region:

group с by с.Region

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

group с by с.Region into eg

В конструкции select проектируется новый анонимный тип, чьи свойства - общая сумма продаж (вычисляемая по обращению к результирующему набору eg) и ключевое значение группы, к которому вы обращаетесь по специальному полю Key группы:

select new { TotalSales = cg.Sum(c => с.Sales), Region = eg.Key }

Групповой результирующий набор реализует интерфейс LINQ IGrouping, который поддерживает свойство Key. Вы почти всегда захотите каким-то образом обратиться к свойству Key при обработке групповых результатов, потому что оно представляет критерий создания каждой группы ваших данных.

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

var orderedResults =

from eg in queryResults

orderby eg.TotalSales descending

select eg

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



1 ... 272 273 274 [ 275 ] 276 277 278 ... 396

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