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.

SpoiledTechie.com
la source

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()
                        };
        }
Tvanfosson
la source
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) }
DamienG
la source
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)
    });
Lu55
la source
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!

denis_n
la source
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"

Javier
la source
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)));
Abhas Bhoi
la source