Come si fa a trovare il massimo gruppo-saggio in LINQ?
Domanda
Sto cercando di risolvere il problema "gruppo-saggio max" in LINQ. Per iniziare, ho un database modellato utilizzando Entity Framework con la seguente struttura:
Customer:
---------
CustomerID : Int32
Name : String
Order:
-------
OrderID : Int32
CustomerID : Int32
Total : Decimal
Questo mi dà la navigazione da un utente secondo i suoi ordini e un Ordine al proprietario.
Sto cercando di creare una query LINQ che mi permette di trovare gli ordini dei clienti top-10 nella base di dati. Il caso più semplice è stato abbastanza facile da trovare:
var q = (
from order in _data.Orders // ObjectQuery<Order>
orderby order.Amount descending select order
).Take(10);
Tuttavia, mi piacerebbe mostrare solo clienti unici in questo elenco. Sono ancora un po 'nuova per LINQ, ma questo è quello che mi è venuta in mente:
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);
Questo sembra funzionare, ma non sono sicuro se questo è l'approccio migliore. In particolare, mi chiedo circa le prestazioni di un tale query in un database molto grande. Inoltre, utilizzando il metodo FirstOrDefault
dalla query gruppo sembra un po 'strano ...
Qualcuno può fornire un approccio migliore, o la certezza che questo è quello giusto?
Soluzione
Si potrebbe fare:
var q = (
from order in _data.Orders // ObjectQuery<Order>
orderby order.Amount descending select order
).Distinct().Take(10);
mi sarebbe normalmente guardare l'SQL generato, e vedere che cosa è il migliore.
Altri suggerimenti
Customer
.Select(c=>new {Order= c.Orders.OrderByDescending(o=>o.Total).First()})
.OrderByDescending(o=>o.Total)
.Take(10);