Wie erhalte ich die MAX-Zeile mit einer GROUP BY-Abfrage in LINQ?

93

Ich suche nach einer Möglichkeit in LINQ, mit der folgenden SQL-Abfrage übereinzustimmen.

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

Ich suche wirklich Hilfe in diesem Fall. Die obige Abfrage erhält aufgrund der Group BySyntax die maximale UID jeder Seriennummer .

SpoiledTechie.com
quelle

Antworten:

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()
                        };
        }
Tvanfosson
quelle
1
Ich möchte beide als Antworten akzeptieren, aber ich denke, ich kann nicht, also habe ich für euch beide gestimmt. Vielen Dank!!!
SpoiledTechie.com
67
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) }
DamienG
quelle
Ich möchte beide als Antworten akzeptieren, aber ich denke, ich kann nicht, also habe ich für euch beide gestimmt. Vielen Dank!!!
SpoiledTechie.com
Beachten Sie auch, dass die Variable für den Ausdruck => Lambda in der Max-Funktion beliebig sein kann (s => s.uid, tv => tv.uid, asdf => asdf.uid). Linq erkennt es automatisch als Auswahl über Elementen vom Typ Seriell.
Michael
29

In Methodenkettenform:

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

Ich habe DamienGs Antwort in LinqPad überprüft. Anstatt

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

sollte sein

g.Max(s => s.uid)

Danke dir!

denis_n
quelle
10
Dies sollte wahrscheinlich ein Kommentar zu DamienGs Antwort sein.
7.
10

Die Antworten sind in Ordnung, wenn Sie nur diese beiden Felder benötigen. Für ein komplexeres Objekt kann dieser Ansatz jedoch hilfreich sein:

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

... dies vermeidet das "Neu auswählen"

Javier
quelle
Ich mag das - wissen Sie, ob es so effizient ist wie die anderen Antworten?
Noelicus
Sie haben die Abfragesyntax hier bis zum Ende verwendet, wo Sie zur Methodensyntax gewechselt sind. Musstest Du? Ist das ein vollständiges Abfragesyntaxformular für Ihre Lösung?
Seth
0

Dies kann mit GroupBy und SelectMany im LINQ-Lamda-Ausdruck erfolgen

var groupByMax = list.GroupBy(x=>x.item1).SelectMany(y=>y.Where(z=>z.item2 == y.Max(i=>i.item2)));
Abhas Bhoi
quelle