2012-04-11 50 views
7

Digamos que tengo un modelo definido como: Foo {Id, Date}.Expresión lambda para la fecha más reciente

¿Hay alguna forma de hacer una expresión booleana lambda para poder obtener el Foo con la fecha más reciente? algo a lo largo de las líneas de (f => f.Date IsLatest)?

Respuesta

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

El resultado no sería un 'DateTime'. – Guffa

+0

@Guffa de hecho, corrigió que – ionden

+0

Véase también MaxBy() en la biblioteca de Jon Skeet [morelinq] (http://code.google.com/p/morelinq/) –

0

Prueba esto:

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

"obtener el Foo con la fecha más reciente", no "obtener la última fecha" – AakashM

3

Dado que no se ha proporcionado ninguna información sobre el nombre de sus entidades (estoy asumiendo foos aquí); algo como esto:

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

Y si hay más de un con la fecha max (Sé que dijo 'Foo con la última ...', pero no sé la resolución de sus tiempos aquí) de lo que realmente estarás después de algo más parecido a la respuesta de Guffa.

Tenga en cuenta que cualquiera de las soluciones se beneficiará enormemente de un índice en la columna de fecha. Si no hay índice y la tabla se vuelve grande? Entonces podría ser muy lento.

+0

Estaba pensando en algo como foos.Dónde (f => f.Fecha IsLatest). De hecho, estaba probando mi mano en el patrón de especificación y necesito que sea una expresión booleana. – evablack

+0

Sí, pero eso ni siquiera es C#, por lo que no se compilará, estoy seguro de que usted también lo sabe. No estoy convencido de que haya algún beneficio * real en envolver EF de esta manera, tampoco. Seguramente un método de acceso directo en su clase ObjectContext 'GetLatestFoo' que hace algo como lo anterior sería lo más simple? –

2

Para hacer una expresión que determina si la fecha es la más reciente, lo que necesita saber la fecha más reciente, es decir:

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

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

Otro enfoque sería para ordenar los elementos:

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

o el uso agregado:

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

Creo que podría querer decir 'Foo.Where (f => f.Date == latestDate);' :) –

+1

@AndrasZoltan: Sí, tiene razón. Gracias por atrapar eso. – Guffa

0

puedes probar el siguiente código:

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