7
votes

Expression Lambda pour la dernière date

Disons que j'ai un modèle défini comme: foo {id, date} .

Y a-t-il un moyen de faire une expression booléenne lambda afin que je puisse obtenir le foo à la dernière date? quelque chose sur les lignes de (f => f.date islamest) ?


0 commentaires

5 Réponses :


1
votes

Essayez ceci:

DateTime maxDate = FooCollection.Max(f=>f.Date)


1 commentaires

"Obtenez le foo avec la dernière date", pas "Obtenez la dernière date"



21
votes
var latest = model.OrderByDescending(m => m.Date).FirstOrDefault();

2 commentaires

Le résultat ne serait pas un DateTime .


Voir aussi maxby () dans Jon Skeet's Morelinq bibliothèque



3
votes

étant donné que vous n'avez fourni aucune information sur le nom de vos entités (je suppose que foos ici); quelque chose comme ceci: xxx

et s'il y a plus d'un avec la date maximale (je sais que vous avez dit "le foo avec le dernier ..." Mais je Je ne connais pas la résolution de vos moments ici) que vous serez réellement après quelque chose de plus comme la réponse de Guffa.

Sachez que l'une ou l'autre solution profitera massivement d'un index sur la colonne Date. S'il n'y a pas d'index et que la table devient grande? Ensuite, cela pourrait être très lent.


2 commentaires

Je pensais dans les lignes de quelque chose comme des foos.Où (f => f.date islamest). J'essayais réellement ma main dans le schéma de spécification et j'en ai besoin pour être une expression booléenne.


Oui, mais ce n'est même pas c # afin que cela ne compile pas, je suis sûr que vous le savez aussi. Je ne suis pas convaincu qu'il y ait un réel bénéfice d'avoir eu l'emballage d'EF de cette manière, non plus. Sûrement une méthode de raccourci de votre objetContext Class 'GetLatestFoo' qui fait quelque chose comme ce qui précède serait la chose la plus simple?



4
votes

Pour faire une expression qui détermine si la date est la dernière, vous devez connaître la date la dernière date, c'est-à-dire:

var latestItem = items.Aggregate((d, v) => v.Date > d.Date ? v : d);


1 commentaires

Je pense que vous pourriez dire que vous pourriez dire foo.where (f => f.date == Datedate); :)



0
votes

Vous pouvez essayer le code suivant:

List<Foo> fooList = new List<Foo>();

// add the Foo instance in list here
// then apply following to take latest

fooList.OrderByDescending(p => p.Date).Take(1);


0 commentaires