Вопрос

Я пытаюсь решить проблему «Группового максимального» в LINQ. Для начала у меня есть база данных, смоделированная с использованием структуры объекта со следующей структурой:

Customer:
---------
CustomerID : Int32
Name : String

Order:
-------
OrderID : Int32
CustomerID : Int32
Total : Decimal

Это дает мне навигацию от клиента к ее заказу и заказу владельцу.

Я пытаюсь создать запрос LINQ, который позволяет мне найти топ-10 заказов клиентов в базе данных. Простой случай был довольно легко придумать:

var q = (
    from order in _data.Orders  // ObjectQuery<Order>
    orderby order.Amount descending select order
).Take(10);

Тем не менее, я хотел бы показать только уникальных клиентов в этом списке. Я все еще немного новичок в LINQ, но это то, что я придумал:

var q = (
    from order in _data.Orders  // ObjectQuery<Order>
    group order by order.Customer into o
    select new {
        Name = o.Key.Name,
        Amount = o.FirstOrDefault().Amount
    }
).OrderByDescending(o => o.Amount).Take(10);

Кажется, это работает, но я не уверен, что это лучший подход. В частности, я удивляюсь производительности такого запроса против очень большой базы данных. Кроме того, используя FirstOrDefault Метод из группового запроса выглядит немного странно ...

Может ли кто -нибудь обеспечить лучший подход или некоторую уверенность в том, что это правильный?

Это было полезно?

Решение

Вы могли бы сделать:

var q = (
    from order in _data.Orders  // ObjectQuery<Order>
    orderby order.Amount descending select order
).Distinct().Take(10);

Я бы обычно смотрел на сгенерированный SQL и посмотрел, что самое лучшее.

Другие советы

Customer
.Select(c=>new {Order= c.Orders.OrderByDescending(o=>o.Total).First()})
.OrderByDescending(o=>o.Total)
.Take(10);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top