2010-10-03 5 views
14

Résumé: Comment obtenir top 1 élément ordonnés groupes de donnéesObtenez le premier enregistrement d'un groupe dans LINQ?

Je suis en train de groupe par un champ carid, puis au sein de chaque groupe, je veux trier sur un champ DateTimeStamp descendant. Les données souhaitées seraient pour chaque voiture me donner le dernier DateTimeStamp et seulement 1 dans le groupe.

Je peux arriver à ce point, mais j'ai des problèmes pour retirer le top 1 du groupe et ordonner le groupe par DateTimeStamp desc.

Voici ce que j'ai après la première opération du 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 que le top 1 dans un groupe ordonné

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

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

Brickwall: Où Je me suis arrêté, a besoin de CarId et DateTimeStamp dans la clause group by, afin de trier plus tard par le DateTimeStamp. Peut-être que le tri de la date devrait être fait dans une fonction séparée, pas sûr.

Répondre

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

Ce groupe volonté tous les éléments de CardId, puis commander les éléments de chaque groupe par DateTimeStamp (décroissant), puis rogner chaque groupe pour ne contenir que le premier élément. Enfin, il renvoie un nombre de "groupes" (avec les guillemets effrayants car ils sont en fait un type anonyme au lieu d'un IGrouping) où chaque groupe a le seul élément que vous recherchez.

+5

Ça l'a fait! J'ai reçu une exception et j'ai dû utiliser FirstOrDefault() au lieu de First(). Merci! – RyBolt

+0

+1: Parfait. Juste ce dont j'avais besoin (une version du groupement et du premier enregistrement que je peux réellement suivre :) –

+0

merci, je cherchais ceci, j'ai cherché 'groupe sql par dernier enregistrement' mais je n'ai pas trouvé de solution' groupe linq par dernier enregistrement' aidé à venir ici, seul le besoin est, je dois le faire 'tapé' pour 'ViewModel' – stom

0

Essayez ceci?

var latest = Group1.OrderByDescending(x=>x.DateTimeStamp).FirstOrDefault(); 
+0

Ne est-ce juste retour le premier groupe * *? Pas le premier élément de chaque groupe? –

+0

@Kirk: Oui, il semble que l'OP les a dans des groupes séparés, car chaque 'resultset' a des données de résultat séparées et des en-têtes. Ma réponse a 'Group1' pour souligner comment cela peut être fait avec les deux groupes. –

+0

Comment votre Group1 est-il défini, contient-il Id et DateTimeStamp? – RyBolt

2

je trouve la syntaxe d'expression de requête plus facile de me comprendre:

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() 
}; 
Questions connexes