Стандартные операторы запроса с LINQ - Сортировки и проекции

ОГЛАВЛЕНИЕ

Сортировки и проекции

Возможно, вы заметили, что в предыдущем примере мы использовали проекцию. Запрос LINQ возвращает список клиентов только после использования оператора Max. До этого возвращается проекция, которая создает новую сущность, имеющую свойство CustomerID и свойство Total (соответствующее той сумме, которую потратил клиент). Проекции — это компонент LINQ, и если они вопрощаются в последовательности, как в предыдущем примере, к ним можно после этого применять стандартные операторы запросов.

На рис. 1 показана процедура создания проекции новой сущности, содержащей идентификатор клиента и общую сумму его заказов (используется оператор Sum, как было описано выше). На рис. 1 также используется оператор OrderByDescending — для упорядочения проекций сущностей по вычисленной итоговой сумме. Если у двух клиентов оказывается одинаковая сумма, можно использовать дополнительный оператор упорядочения. Например, для введения дополнительного критерия сортировки, в оператор foreach, приведенный на рис. 1, можно добавить следующий код:

Figure 1 Aggregates, Projections, and Ordering

using (Entities entities = new Entities())
{
  var query = from c in entities.Customers
  where c.Orders.Sum(
  o => o.OrderDetails.Sum(od => od.UnitPrice)) > 0
  select new
  {
  c.CustomerID, 
  Total = c.Orders.Sum(
  o => o.OrderDetails.Sum(od => od.UnitPrice))
  };
  foreach (var item in query.OrderByDescending(x => x.Total))
  Console.WriteLine(item.CustomerID + " == " + item.Total);
}

foreach (var item in 
  query.OrderByDescending(x => x.Total)
  .ThenBy(x => x.CustomerID))
{
  Console.WriteLine(item.CustomerID + " == " + item.Total);
}

В данном фрагменте кода мы использовали оператор ThenBy и лямбда-выражение. В результате первым критерием сортировки последовательности является общая сумма заказов (по убыванию), а вторым — идентификатор CustomerID, имеющийся в проекции (по убыванию).