Obtenez le premier enregistrement d'un groupe dans LINQ?

c# c#-4.0 entity-framework linq linq-to-entities

Question

Résumé: Comment obtenir le premier élément dans des groupes de données ordonnés

J'essaie de grouper par un champ CarId, puis au sein de chaque groupe, je veux effectuer un tri décroissant sur un champ DateTimeStamp. Les données souhaitées seraient pour chaque voiture, donnez-moi le dernier DateTimeStamp et seulement celui-ci dans le groupe.

Je peux arriver à ce point, mais avoir des problèmes pour prendre le top 1 du groupe et le classer par DateTimeStamp desc.

Voici ce que j'ai après la première opération de groupe :

group 1
------------------------
CarId  DateTimeStamp 
1      1/1/2010
1      1/3/2010
1      3/4/2010

group 2
------------------------
CarId  DateTimeStamp 
2      10/1/2009
2      1/3/2010
2      9/4/2010

ce que je désirerais seulement le top 1 dans un groupe ordonné

    group 1
    ------------------------
    CarId  DateTimeStamp 
    1      3/4/2010

    group 2
    ------------------------
    CarId  DateTimeStamp 
    2      9/4/2010

Brickwall: Là où je suis arrêté, il faut les identifiants CarId et DateTimeStamp dans la clause group by, pour pouvoir ensuite trier par DateTimeStamp. Peut-être que le tri de la date devrait être fait dans une fonction distincte, pas sûr.

Réponse acceptée

data
    .GroupBy(
        x => x.CardId, 
        (x, y) => new { 
            Key = x, 
            Value = y.OrderByDescending(z => z.DateTimeStamp).FirstOrDefault() 
        }
    );

Cela regroupera tous les éléments par CardId , ordonnera ensuite les éléments de chaque groupe par DateTimeStamp (décroissant), puis réduira chaque groupe pour ne contenir que le premier élément. Enfin, il renvoie un énumérable de "groupes" (avec les guillemets d'effarouchement puisqu'il s'agit en fait d'un type anonyme plutôt que d'un IGrouping ), chaque groupe IGrouping l'élément que vous recherchez.


Réponse populaire

Je trouve la syntaxe d'expression de requête plus facile à comprendre moi-même:

from x in data 
group x by x.CarId into grp
select new {
    CarId = x.CarId,
    Record = (from x in grp orderby z.DateTimeStamp descending).FirstOrDefault()
};


Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow