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 .

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()
                        };
        }

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) }

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)
    });

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!


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"


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)));
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.