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.