J'utilise LINQ sur un IQueryable renvoyé par NHibernate et je dois sélectionner la ligne avec la (les) valeur (s) maximale (s) dans quelques champs.
J'ai simplifié la partie sur laquelle je m'accroche. Je dois sélectionner la ligne de ma table avec la valeur maximale dans un champ.
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
Ceci est incorrect mais je ne parviens pas à trouver le bon formulaire.
BTW, ce que j'essaie réellement de réaliser est à peu près ceci:
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();
J'ai commencé avec le lambda ci-dessus mais j'ai utilisé LINQPad pour essayer de trouver la syntaxe pour sélectionner le Max ().
METTRE À JOUR
La suppression de GroupBy était la clé.
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();
Réponses:
Je ne vois pas pourquoi vous groupez ici.
Essaye ça:
Une autre approche qui n'itérerait
table
qu'une seule fois serait la suivante:Ceci est utile s'il
table
s'agit d'un élémentIEnumerable<T>
qui n'est pas présent en mémoire ou qui est calculé à la volée.la source
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
.Vous pouvez également faire:
la source
Vous pouvez regrouper par statut et sélectionner une ligne dans le plus grand groupe:
Le premier
First()
obtient le premier groupe (l'ensemble de lignes avec le plus grand statut); le secondFirst()
obtient la première ligne de ce groupe.Si le statut est toujours unqiue, vous pouvez remplacer le second
First()
parSingle()
.la source
Pour répondre à la première question, si vous devez prendre plusieurs lignes regroupées selon certains critères avec l'autre colonne avec une valeur maximale, vous pouvez faire quelque chose comme ceci:
la source
Plus un exemple:
Suivre:
Équivaut à:
la source
Simplement en une seule ligne:
Notez qu'il y a deux actions. l'action intérieure est pour trouver la valeur maximale, l'action extérieure est pour obtenir l'objet désiré.
la source