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)
?
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)
?
var latest = model.OrderByDescending(m => m.Date).FirstOrDefault();
Spróbuj tego:
DateTime maxDate = FooCollection.Max(f=>f.Date)
"pobierz Foo z najnowszą datą", a nie "pobierz najnowszą datę" – AakashM
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.
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
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? –
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);
Myślę, że możesz mieć na myśli 'Foo.Where (f => f.Date == latestDate);' :) –
@AndrasZoltan: Tak, masz rację. Dzięki za złapanie tego. – Guffa
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);
Wynik nie będzie "DateTime". – Guffa
@Guffa w istocie poprawił to – ionden
Zobacz także MaxBy() w bibliotece [morelinq] Jona Skeeta (http://code.google.com/p/morelinq/) –