Como você encontra o Max no Linq em grupo?
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?
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);