Стандартные операторы запроса с 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, имеющийся в проекции (по убыванию).