2012-04-11 6 views
7

私はモデルがFoo {Id, Date}として定義されているとしましょう。最新の日付のラムダ式

Fooの最新の日付を取得できるようにブール値のラムダ式を作成する方法はありますか? (f => f.Date IsLatest)の行に沿った何か?

答えて

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

結果は「DateTime」ではありません。 – Guffa

+0

@Guffa確かに、それを訂正しました – ionden

+0

Jon Skeetの[morelinq](http://code.google.com/p/morelinq/)ライブラリのMaxBy()も参照してください –

0

これを試してください:あなたは(私はここfoosと仮定しています)あなたのエンティティの名前についての情報を提供しなかったこと

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

「最新の日付でFooを取得する」ではなく「最新の日付を取得する」 – AakashM

3

を考えます。このような何か:

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

そして存在する場合最大日付(I「の...最新のFoo」あなたが言った知っているが、私はあなたの倍の解像度を知らないと、複数のここではGuffaの答えのようなものより実際に後になるでしょう)。

どちらのソリューションでも、日付列のインデックスから大量のメリットが得られることに注意してください。インデックスがなく、テーブルが大きくなったら?その後、非常に遅くなる可能性があります。

+0

私はfoosのような行に沿って考えていました。 f => f.Date IsLatest)。私は実際に仕様パターンで自分の手を試していたので、それをブール式にする必要があります。 – evablack

+0

はい、それはC#でさえないので、コンパイルされません。あなたもそれを知っていると確信しています。私は、このようにEFをラップするのに本当の*利点があると確信していません。確かに、上記のような何かをするObjectContextクラス 'GetLatestFoo'のショートカットメソッドは最も単純なものでしょうか? –

2

日付が最新であるかどうかを決定する式を作成するには、すなわち、最新の日付を知っておく必要があります。

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

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

別のアプローチは、アイテムを並べ替えるために、次のようになります。

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

または、集計を使用:

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

私はあなたが 'Foo.Where(f => f.Date == latestDate);'を意味すると思います: –

+1

@AndrasZoltan:はい、そうです。それをキャッチするためにありがとう。 – Guffa

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