2012-04-11 38 views
7

Diyelim ki şöyle bir modelim var: Foo {Id, Date}.Lambda İfadesi

Foo'yu en son tarihe kadar alabilmem için bir boolean lambda ifadesi oluşturmanın bir yolu var mı? (f => f.Date IsLatest) hatları boyunca bir şey?

cevap

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

Sonuç bir "DateTime" olmaz. – Guffa

+0

@Guffa, düzeltildi, – ionden

+0

Ayrıca bkz. MaxBy() Jon Skeet [morelinq] (http://code.google.com/p/morelinq/) kütüphanesinde –

0

bu deneyin: (Burada foos varsayarak) senin kişilerin isim hakkında herhangi bir bilgi verilmemektedir ettik

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

"Foo'yu en son tarihle al", "en son tarih olsun" – AakashM

3

Verilen; Böyle bir şey:

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

Ve varsa max tarihine (ı '... en son Foo' dedin biliyorum ama senin kez çözünürlüğünü bilmiyorsanız sahip birden fazla burada) aslında Guffa'nın cevabı gibi bir şeyden sonra olacaksın.

Her iki çözümün de tarih sütunundaki bir dizinden büyük ölçüde faydalanacağını unutmayın. İndeks yoksa ve tablo büyürse? O zaman çok yavaş olabilirdi.

+0

Düşündüğüm gibi bir şeylerin çizgileri üzerinde düşünürdüm. f => f.Date IsLatest). Aslında Şartname Deseni'nde elimi deniyordum ve bunun bir boole ifadesi olmasına ihtiyacım var. – evablack

+0

Evet, ama bu bile C# değil, bu yüzden derlemeyecek, siz de biliyorsunuzdur. EF'i bu şekilde sarmada bulunacak herhangi bir gerçek * fayda * olduğuna ikna olmadım. Kesinlikle ObjectContext sınıfında 'GetLatestFoo' üzerinde bir kısayol yöntemi, yukarıdaki gibi bir şey yapar en basit şey olurdu? –

2

tarih son olup olmadığını belirleyen bir ifade yapmak için, en son tarih bilmek yani gerekir:

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

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

başka bir yaklaşım öğeleri sıralamak için olacaktır:

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

veya Agrega kullanın:

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

Sanırım Foo.Where (f => f.Date == latestDate); ':) –

+1

@AndrasZoltan: Evet, haklısınız demektir. Bunu yakaladığın için teşekkürler. – Guffa

0

aşağıdaki kodu deneyebilirsiniz:

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); 
İlgili konular