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?

È stato utile?

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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top