2012-04-11 19 views
7

Diciamo che ho un modello definito come: Foo {Id, Date}.Espressione lambda per l'ultima data

C'è un modo per fare un'espressione lambda booleana in modo che io possa ottenere il Foo con l'ultima data? qualcosa sulla falsariga di (f => f.Date IsLatest)?

risposta

19
var latest = model.OrderByDescending(m => m.Date).FirstOrDefault(); 
+0

Il risultato non sarebbe un 'DateTime'. – Guffa

+0

@Guffa infatti, corretto che – ionden

+0

Vedere anche MaxBy() nella libreria [morelinq] (http://code.google.com/p/morelinq/) di Jon Skeet –

0

Prova questo:

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

"ottenere il Foo con l'ultima data", non "ottenere l'ultima data" – AakashM

3

Dato che non hai fornito alcuna informazione circa il nome delle vostre entità (sto supponendo foos qui); qualcosa di simile:

var latest = foos.OrderByDescending(f => f.Date).FirstOrDefault(); 

E se ci sono più di un con la data massima (So che hai detto 'il Foo con l'ultima ...', ma non so la risoluzione delle volte qui) di quello che in realtà sarai dopo qualcosa di più simile alla risposta di Guffa.

Tenere presente che entrambe le soluzioni trarranno un vantaggio enorme da un indice nella colonna della data. Se non ci sono indici e il tavolo diventa grande? Quindi potrebbe essere molto lento.

+0

Stavo pensando sulla falsariga di qualcosa di simile a foos.Where (f => f.Date IsLatest). In realtà stavo provando la mia mano nello Specification Pattern e ho bisogno che fosse un'espressione booleana. – evablack

+0

Sì, ma non è nemmeno C# quindi non verrà compilato, sono sicuro che lo sai anche tu. Non sono nemmeno convinto che ci sia un vero * beneficio * da avere nel confezionare EF in questo modo. Sicuramente un metodo di scelta rapida sulla classe ObjectContext 'GetLatestFoo' che fa qualcosa di simile a quanto sopra sarebbe la cosa più semplice? –

2

Per fare un'espressione che determina se la data è l'ultimo, è necessario conoscere la data ultima, vale a dire:

DateTime latestDate = items.Max(f => f.Date); 

var latestItems = items.Where(f => f.Date == latestDate); 

Un altro approccio sarebbe quello di ordinare gli elementi:

var latestItem = items.OrderBy(f => f.Date).First(); 

oppure utilizzare Aggregate:

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

Penso che potresti voler dire 'Foo.Where (f => f.Date == latestDate);' :) –

+1

@AndrasZoltan: Sì, hai ragione. Grazie per averlo capito. – Guffa

0

si può provare il seguente codice:

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);