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


94

Je recherche 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

Je cherche vraiment de l'aide sur celui-ci. La requête ci-dessus obtient l'uid maximum de chaque numéro de série en raison de la Group Bysyntaxe.

Réponses:


92
        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
Je veux accepter les deux comme réponses, mais je suppose que je ne peux pas alors j'ai voté pour vous deux. Merci un BUNCH !!!
SpoiledTechie.com

69
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) }

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

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 des éléments de type Serial.
Michael

30

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

22

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)

Je vous remercie!


10
Cela devrait probablement un commentaire sur la réponse de DamienG.
Cᴏʀʏ

10

Les réponses sont OK si vous n'avez besoin que de ces deux champs, mais pour un objet plus complexe, cette approche pourrait peut-être ê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 "sélectionner nouveau"


J'aime ça - savez-vous si c'est aussi efficace que les autres réponses?
noelicus

Vous avez utilisé la syntaxe de requête ici jusqu'à la fin, où vous êtes passé à la syntaxe de méthode. Avez-vous dû? Le formulaire de syntaxe de requête complet est-il pour votre solution?
Seth

0

Cela peut être fait en utilisant GroupBy et SelectMany dans l'expression lamda LINQ

var groupByMax = list.GroupBy(x=>x.item1).SelectMany(y=>y.Where(z=>z.item2 == y.Max(i=>i.item2)));
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.