2012-04-11 17 views
7

Załóżmy, że mam model zdefiniowany jako: Foo {Id, Date}.Wyrażenie Lambda na ostatnią datę

Czy istnieje sposób na wyrażenie lambda boolean, aby móc uzyskać Foo z najnowszą datą? coś podobnego do linii (f => f.Date IsLatest)?

Odpowiedz

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

Wynik nie będzie "DateTime". – Guffa

+0

@Guffa w istocie poprawił to – ionden

+0

Zobacz także MaxBy() w bibliotece [morelinq] Jona Skeeta (http://code.google.com/p/morelinq/) –

0

Spróbuj tego:

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

"pobierz Foo z najnowszą datą", a nie "pobierz najnowszą datę" – AakashM

3

Biorąc pod uwagę, że nie podajemy żadnych informacji o nazwie firmy jednostek (jestem zakładając foos tutaj); coś takiego:

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

A jeśli istnieje więcej niż jeden z datą max (wiem, że powiedział: „Foo z najnowszymi ...”, ale nie wiem, rozdzielczość swoich czasów tutaj) niż faktycznie będziesz po coś bardziej podobnego do odpowiedzi Guffy.

Należy pamiętać, że każde rozwiązanie skorzysta masowo z indeksu w kolumnie daty. Jeśli nie ma indeksu, a tabela staje się duża? Wtedy może być bardzo powolny.

+0

Myślałem o liniach czegoś w stylu foos. Tam (f => f.Date IsLatest). W rzeczywistości próbowałem swoich sił w Wzorze specyfikacji i potrzebuję tego, aby był wyrażeniem boolowskim. – evablack

+0

Tak, ale to nawet nie jest C#, więc nie skompiluje się, jestem pewien, że też o tym wiesz. Nie jestem przekonany, że istnieje jakaś prawdziwa * korzyść *, którą można by osiągnąć w owijaniu EF w ten sposób. Z pewnością metoda skrótu w klasie ObjectContext "GetLatestFoo", która ma coś podobnego do powyższego, byłaby najprostsza? –

2

Aby wyrażenie, które określa, czy data jest późniejsza, trzeba wiedzieć ostatnią datę, tj:

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

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

Innym rozwiązaniem byłoby, aby posortować elementy:

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

lub użyj Łącznie:

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

Myślę, że możesz mieć na myśli 'Foo.Where (f => f.Date == latestDate);' :) –

+1

@AndrasZoltan: Tak, masz rację. Dzięki za złapanie tego. – Guffa

0

można spróbować następujący kod:

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); 
Powiązane problemy