2012-04-11 29 views
7

比方说,我有一个模型定义为:Foo {Id, Date}最近日期的Lambda表达式

有没有办法让一个布尔lambda表达式,以便我可以得到最新的日期Foo?东西沿线(f => f.Date IsLatest)

回答

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

结果不会是'DateTime'。 – Guffa 2012-04-11 11:07:57

+0

@Guffa确实,纠正 – ionden 2012-04-11 11:11:16

+0

另请参见Jon Skeet的[morelinq](http://code.google.com/p/morelinq/)库中的MaxBy() – 2012-04-11 12:15:33

0

试试这个:

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

“获取最新日期的Foo”,而不是“获取最新日期” – AakashM 2012-04-11 10:59:05

3

既然你没有提供有关实体的名称(我假设foos这里)的任何信息;是这样的:

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

如果有不止一个与最大日期(我知道你说的“用最新的富......”,但我不知道你的时间分辨率这里)比你实际上更像Guffa的回答之后。

请注意任一解决方案都将从日期列的索引中大量获益。如果没有索引,表格变大?那可能会很慢。

+0

我正在考虑类似foos.Where( f => f.Date IsLatest)。我实际上是在规范模式中尝试我的手,我需要它是一个布尔表达式。 – evablack 2012-04-12 00:12:47

+0

是的,但那不是c#所以它不会编译,我相信你也知道这一点。我不相信用这种方式包装EF也有任何真正的好处。当然在你的ObjectContext类的'GetLatestFoo'上做一个类似上述的简单方法会是最简单的事情吗? – 2012-04-12 07:39:27

2

要作出这样的决定,如果日期是最新的一种表达,你需要了解最新的日期,即:

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

我想你可能是指'Foo.Where(f => f.Date == latestDate);':) – 2012-04-11 10:59:58

+1

@AndrasZoltan:是的,你说得对。感谢您的支持。 – Guffa 2012-04-11 11:06:08

0

您可以尝试下列代码:

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