2010-08-27 7 views
1

J'ai une table et pour les besoins de l'exemple disons qu'elle a trois colonnes: Nom, DateAdded, Note. Dans cette table il y aura plusieurs enregistrements avec le même nom. J'ai besoin d'une clause linq where qui me donnera un ensemble de résultats avec l'enregistrement le plus récent pour chaque nom.Linq to Entities 3.5 où la date la plus récente

Donc, si j'avais les informations suivantes:

Name, DateAdded, Note 
Alpha, 1/1/2010, note one 
Alpha, 1/2/2010, note two 
Alpha, 1/3/2010, note three 
Beta, 1/4/2010, note four 
Beta, 1/5/2010, note five 

Je vous attendre à obtenir les résultats suivants:

Name, DateAdded, Note 
Alpha, 1/3/2010, note three 
Beta, 1/5/2010, note five 

En utilisation réelle cela va être une option de recherche, donc je besoin être une clause .Where je peux ajouter à une collection IQueryable si possible.

Répondre

0
from row in rows 
group row by row.Name into grouping 
from g in grouping 
where g.DateAdded == grouping.Max(x => x.DateAdded) 
select g; 

S'il y a plus d'une ligne avec le DateAdded maximum dans un certain groupe, cela renvoie toutes les lignes.

Vous n'avez pas besoin d'une seule clause Where. Si rows est un IQueryable, le résultat de cette requête l'est également, vous pouvez donc l'utiliser en tant que partie d'une chaîne. Mais je n'ai aucune idée de la façon dont cette requête se traduit par SQL.

+0

Vous pouvez essayer quelque chose comme 'où g == grouping.OrderByDescending (x => x.DateAdded) .First()' à la place pour être sûr d'obtenir une seule ligne pour chaque groupe. –

+0

Je ne sais pas pourquoi votre code n'a pas fonctionné pour moi mais j'ai été capable de le faire comme ceci: résultats = results.Where (i => i.DateAdded == context.rows.Where (o => o.row.name == i.row.name) .OrderByDescending (o => o.DateAdded) .FirstOrDefault(). DateAdded); Merci pour l'aide. – William

Questions connexes