Come ottengo la riga MAX con una query GROUP BY in LINQ?


94

Sto cercando un modo in LINQ per abbinare la seguente query SQL.

Select max(uid) as uid, Serial_Number from Table Group BY Serial_Number

Sto davvero cercando aiuto su questo. La query precedente ottiene l'uid massimo di ogni numero di serie a causa della Group Bysintassi.

Risposte:


92
        using (DataContext dc = new DataContext())
        {
            var q = from t in dc.TableTests
                    group t by t.SerialNumber
                        into g
                        select new
                        {
                            SerialNumber = g.Key,
                            uid = (from t2 in g select t2.uid).Max()
                        };
        }

1
Voglio accettare entrambi come risposte, ma immagino di non poterlo fare quindi ho votato per entrambi. Grazie mille!!!
SpoiledTechie.com

68
var q = from s in db.Serials
        group s by s.Serial_Number into g
        select new {Serial_Number = g.Key, MaxUid = g.Max(s => s.uid) }

Voglio accettare entrambi come risposte, ma immagino di non poterlo fare quindi ho votato per entrambi. Grazie mille!!!
SpoiledTechie.com

Si noti inoltre che la variabile per l'espressione => lambda nella funzione Max può essere qualsiasi cosa (s => s.uid, tv => tv.uid, asdf => asdf.uid). Linq lo riconoscerà automaticamente come selezione di elementi di tipo Seriale.
Michael

29

In forma di catena di metodi:

db.Serials.GroupBy(i => i.Serial_Number).Select(g => new
    {
        Serial_Number = g.Key,
        uid = g.Max(row => row.uid)
    });

22

Ho controllato la risposta di DamienG in LinqPad. Invece di

g.Group.Max(s => s.uid)

dovrebbe essere

g.Max(s => s.uid)

Grazie!


10
Questo dovrebbe probabilmente essere un commento sulla risposta di DamienG.
Cᴏʀʏ

10

Le risposte sono OK se richiedi solo questi due campi, ma per un oggetto più complesso, forse questo approccio potrebbe essere utile:

from x in db.Serials 
group x by x.Serial_Number into g 
orderby g.Key 
select g.OrderByDescending(z => z.uid)
.FirstOrDefault()

... questo eviterà il "seleziona nuovo"


Mi piace: sai se è efficiente come le altre risposte?
noelicus

Hai usato la sintassi della query qui fino alla fine, dove sei passato alla sintassi del metodo. Hai dovuto? Il modulo di sintassi di una query completo è per la tua soluzione?
Seth

0

Questa operazione può essere eseguita utilizzando GroupBy e SelectMany nell'espressione lamda LINQ

var groupByMax = list.GroupBy(x=>x.item1).SelectMany(y=>y.Where(z=>z.item2 == y.Max(i=>i.item2)));
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.