Предположим, у меня есть модель, определенная как: Foo {Id, Date}
.Выражение Лямбды за последнее время
Есть ли способ сделать булевое выражение лямбда, чтобы я мог получить Foo с последней датой? что-то вроде линий (f => f.Date IsLatest)
?
Предположим, у меня есть модель, определенная как: Foo {Id, Date}
.Выражение Лямбды за последнее время
Есть ли способ сделать булевое выражение лямбда, чтобы я мог получить Foo с последней датой? что-то вроде линий (f => f.Date IsLatest)
?
var latest = model.OrderByDescending(m => m.Date).FirstOrDefault();
Попробуйте это:
DateTime maxDate = FooCollection.Max(f=>f.Date)
«получить Foo с последней датой», а не «получить последнюю дату» – AakashM
Учитывая, что вы не предоставили никакой информации о наименовании ваших сущностей (я предполагаю, что foos
здесь); что-то вроде этого:
var latest = foos.OrderByDescending(f => f.Date).FirstOrDefault();
И если есть более чем один с датой макс (я знаю, что ты сказал 'The Foo с последним ... но я не знаю, разрешение вашего времени здесь), чем вы действительно будете после чего-то более похожего на ответ Гуффа.
Помните, что любое решение будет полезно в массовом порядке из индекса в столбце даты. Если индекс отсутствует и таблица становится большой? Тогда это может быть очень медленно.
Я думал о линиях чего-то типа foos.Where (f => f.Date IsLatest). Я на самом деле пытался использовать ее в шаблоне спецификаций, и мне нужно, чтобы это было логическое выражение. – evablack
Да, но это даже не C#, поэтому он не будет компилироваться, я уверен, вы тоже это знаете. Я не уверен, что есть реальная * польза *, которую можно было бы обернуть EF таким же образом. Разумеется, проще всего использовать метод ярлыков для вашего класса ObjectContext «GetLatestFoo», который делает что-то подобное выше? –
Для того, чтобы выражение, которое определяет, если дата является последним, что вам нужно знать последнюю дату, а именно:
DateTime latestDate = items.Max(f => f.Date);
var latestItems = items.Where(f => f.Date == latestDate);
Другой подход будет сортировать элементы:
var latestItem = items.OrderBy(f => f.Date).First();
Или использовать Aggregate:
var latestItem = items.Aggregate((d, v) => v.Date > d.Date ? v : d);
Я думаю, вы могли бы означать 'Foo.Where (f => f.Date == lastDate);' :) –
@AndrasZoltan: Да, вы правы. Спасибо, что поймал это. – Guffa
Вы можете попробовать следующий код:
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);
Результат не будет «DateTime». – Guffa
@ Guffa действительно исправил это – ionden
См. Также MaxBy() в библиотеке [morelinq] (http://code.google.com/p/morelinq/) Jon Skeet –