Pergunta

Estou tentando resolver o problema "Max em grupo" no LINQ. Para começar, tenho um banco de dados modelado usando a estrutura da entidade com a seguinte estrutura:

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

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

Isso me dá navegação de um cliente para seus pedidos e um pedido ao proprietário.

Estou tentando criar uma consulta LINQ que me permita encontrar os 10 pedidos de clientes no banco de dados. O caso simples foi muito fácil de criar:

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

No entanto, eu gostaria de mostrar apenas clientes exclusivos nesta lista. Ainda sou um pouco novo no LINQ, mas é isso que eu inventei:

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);

Isso parece funcionar, mas não tenho certeza se essa é a melhor abordagem. Especificamente, me pergunto sobre o desempenho de uma consulta em um banco de dados muito grande. Além disso, usando o FirstOrDefault O método da consulta do grupo parece um pouco estranho ...

Alguém pode fornecer uma abordagem melhor ou alguma garantia de que essa é a certa?

Foi útil?

Solução

Você poderia fazer:

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

Normalmente, eu olhava para o SQL gerado e vi o melhor.

Outras dicas

Customer
.Select(c=>new {Order= c.Orders.OrderByDescending(o=>o.Total).First()})
.OrderByDescending(o=>o.Total)
.Take(10);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top