107 votes

Comment obtenir la ligne MAX avec un GROUP BY dans une requête LINQ ?

Je cherche un moyen dans LINQ de faire correspondre la requête SQL suivante.

Select max(uid) as uid, Serial_Number from Table Group BY Serial_Number

J'ai vraiment besoin d'aide sur ce point. La requête ci-dessus obtient l'uid maximum de chaque numéro de série à cause de la fonction Group By Syntaxe.

102voto

tvanfosson Points 268301
        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 votes

Je veux accepter les deux comme réponses, mais je suppose que je ne peux pas, alors j'ai voté pour vous deux. Merci BEAUCOUP ! !!

74voto

DamienG Points 3849
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) }

0 votes

Je veux accepter les deux comme réponses, mais je suppose que je ne peux pas, alors j'ai voté pour vous deux. Merci BEAUCOUP ! !!

0 votes

Notez également que la variable pour l'expression lambda => dans la fonction Max peut être n'importe quoi (s => s.uid, tv => tv.uid, asdf => asdf.uid). Linq le reconnaîtra automatiquement comme sélectionnant les éléments de type Serial.

42voto

Lu55 Points 2339

Sous forme de chaîne de méthodes :

db.Serials.GroupBy(i => i.Serial_Number).Select(g => new
    {
        Serial_Number = g.Key,
        uid = g.Max(row => row.uid)
    });

24voto

denis_n Points 464

J'ai vérifié la réponse de DamienG dans LinqPad. Au lieu de

g.Group.Max(s => s.uid)

devrait être

g.Max(s => s.uid)

Merci !

15 votes

Ceci devrait probablement être un commentaire sur la réponse de DamienG.

14voto

Javier Points 1755

Les réponses sont correctes si vous n'avez besoin que de ces deux champs, mais pour un objet plus complexe, cette approche pourrait être utile :

from x in db.Serials 
group x by x.Serial_Number into g 
orderby g.Key 
select g.OrderByDescending(z => z.uid)
.FirstOrDefault()

... cela évitera le "select new".

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