2016-07-11 5 views
5

ich die folgende einfache Tabelle habe mit ID, ContactID und Kommentar.So wählt letzten Datensatz in einer LINQ GroupBy-Klausel

enter image description here

Ich möchte Datensätze auszuwählen und GroupBy contactId. Ich habe diese LINQ Erweiterungsmethode Aussage:

Mains.GroupBy(l => l.ContactID) 
.Select(g => g.FirstOrDefault()) 
.ToList() 

Es gibt Rekord 1 und 4. Wie kann ich LINQ verwenden, um die ContactID mit der höchsten ID zu erhalten? (Dh Rückkehr 3 und 6)

Antwort

11

Sie können Sie Einzelteile bestellen

Mains.GroupBy(l => l.ContactID) 
.Select(g=>g.OrderByDescending(c=>c.ID).FirstOrDefault()) 
.ToList() 
5

Verwenden OrderByDescending auf die Elemente in der Gruppe:

Mains.GroupBy(l => l.ContactID) 
    .Select(g => g.OrderByDescending(l => l.ID).First()) 
    .ToList(); 
Auch

, gibt es keine Notwendigkeit für FirstOrDefault, wenn eine Auswahl Artikel aus der Gruppe; Eine Gruppe hat immer mindestens einen Gegenstand, so dass Sie First() sicher verwenden können.

1

OrderByDescending

Mains.GroupBy(l => l.ContactID) 
.Select(g=>g.OrderByDescending(c=>c.ID).FirstOrDefault()) 
.ToList() 

ist die beste Lösung

Es Aufträge von der höchsten ID absteigend, die aus dem Namen ziemlich offensichtlich ist.

3

Vielleicht Auswahl mit Max statt OrderByDescending konnte in Folge der Verbesserung der Leistung (ich bin nicht sicher, wie es im Inneren gemacht hat, so dass es getestet werden muss):

var grouped = Mains.GroupBy(l => l.ContactID); 
var ids = grouped.Select(g => g.Max(x => x.Id)); 
var result = grouped.Where(g => ids.Contains(g.Id)); 

Wie ich nehme an, es führen könnte in eine Abfrage, die MAX dauert und dann SELECT * FROM ... WHERE id IN ({max ids here}), die deutlich schneller als OrderByDescending sein könnte.

Fühlen Sie sich frei, mich zu korrigieren, wenn ich nicht richtig bin.

Verwandte Themen