Ich verwende LINQ für ein von NHibernate zurückgegebenes IQueryable und muss die Zeile mit den Maximalwerten in einigen Feldern auswählen.
Ich habe das Stück, an dem ich festhalte, vereinfacht. Ich muss die eine Zeile aus meiner Tabelle mit dem Maximalwert in einem Feld auswählen.
var table = new Table { new Row(id: 1, status: 10), new Row(id: 2, status: 20) }
from u in table
group u by 1 into g
where u.Status == g.Max(u => u.Status)
select u
Das ist falsch, aber ich kann nicht das richtige Formular finden.
Übrigens versuche ich eigentlich Folgendes zu erreichen:
var clientAddress = this.repository.GetAll()
.GroupBy(a => a)
.SelectMany(
g =>
g.Where(
a =>
a.Reference == clientReference &&
a.Status == ClientStatus.Live &&
a.AddressReference == g.Max(x => x.AddressReference) &&
a.StartDate == g.Max(x => x.StartDate)))
.SingleOrDefault();
Ich habe mit dem obigen Lambda begonnen, aber ich habe LINQPad verwendet, um die Syntax für die Auswahl von Max () zu erarbeiten.
AKTUALISIEREN
Das Entfernen des GroupBy war der Schlüssel.
var all = this.repository.GetAll();
var address = all
.Where(
a =>
a.Reference == clientReference &&
a.Status == ClientStatus.Live &&
a.StartDate == all.Max(x => x.StartDate) &&
a.AddressReference == all.Max(x => x.AddressReference))
.SingleOrDefault();
Antworten:
Ich verstehe nicht, warum Sie sich hier gruppieren.
Versuche dies:
Ein alternativer Ansatz, der
table
nur einmal wiederholt werden würde, wäre folgender:Dies ist hilfreich, wenn
table
es sich um ein Gerät handeltIEnumerable<T>
, das nicht im Speicher vorhanden ist oder das im laufenden Betrieb berechnet wird.quelle
from u in User_Accounts where u.Status == User_Accounts.Max(y => y.Status) select u
table.First(x => x.Status == table.Max(x => x.Status))
table
.Sie können auch tun:
quelle
Sie können nach Status gruppieren und eine Zeile aus der größten Gruppe auswählen:
Die erste
First()
erhält die erste Gruppe (die Menge der Zeilen mit dem größten Status); Die zweiteFirst()
erhält die erste Zeile in dieser Gruppe.Wenn der Status immer eindeutig ist, können Sie den zweiten
First()
durch ersetzenSingle()
.quelle
Bei der Beantwortung der ersten Frage können Sie Folgendes tun, wenn Sie mehrere nach bestimmten Kriterien gruppierte Zeilen mit der anderen Spalte mit dem Maximalwert aufnehmen müssen:
quelle
Mehr ein Beispiel:
Folgen:
Gleich:
quelle
Einfach in einer Zeile:
Beachten Sie, dass es zwei Aktionen gibt. Die innere Aktion dient zum Ermitteln des Maximalwerts, die äußere Aktion zum Abrufen des gewünschten Objekts.
quelle