121 votes

LINQ Utiliser Max() pour sélectionner une seule ligne

J'utilise LINQ sur un IQueryable retourné par NHibernate et j'ai besoin de 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 mon tableau qui contient 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

C'est incorrect, mais je n'arrive pas à trouver la bonne forme.

BTW, ce que j'essaie 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 la lambda ci-dessus mais j'ai utilisé LINQPad pour essayer de trouver la syntaxe pour sélectionner Max().

MISE À JOUR

La suppression du GroupBy était essentielle.

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

0voto

SantanaFire Points 101

Plus d'un exemple :

Suivre :

 qryAux = (from q in qryAux where
            q.OrdSeq == (from pp in Sessao.Query<NameTable>() where pp.FieldPk
            == q.FieldPk select pp.OrdSeq).Max() select q);

Équivaut :

 select t.*   from nametable t  where t.OrdSeq =
        (select max(t2.OrdSeq) from nametable t2 where t2.FieldPk= t.FieldPk)

-1voto

Shneor Points 1

Simplement en une seule ligne :

var result = table.First(x => x.Status == table.Max(y => y.Status));

Remarquez qu'il y a deux actions. l'action intérieure permet de trouver la valeur maximale, l'action extérieure permet d'obtenir l'objet désiré.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X