2009-12-18 21 views
6

MyID adında bir öznitelikte gruplanmış bir grup satır var. Şimdi her gruptan bir satırın StatusDate özniteliğinin bu gruptaki en yüksek olduğu yeri istiyorum.LINQ: Satır

Bu benim ortaya koyduğum şey. biraz daha açıklama ile

rows.Select(x => x.Where(y => y.StatusDate == x.Max(z => z.StatusDate)).First()) 

:

rows.Select(x => // x is a group 
    x.Where(y => // get all rows in that group where... 
       // the status date is equal to the largest 
       // status date in the group 
    y.StatusDate == x.Max(z => z.StatusDate) 
).First()) // and then get the first one of those rows 

bunu yapmak için daha hızlı ya da daha deyimsel yolu var mı?

rows.Select(x => x.OrderByDescending(y => y.StatusDate).First()); 

... ve sorgu optimizasyoncusu her şeyi sıralamak için değil gerçekten ihtiyacı da artar bilir olmadığını kontrol edin:

+0

Neden en büyük DateTime ile tüm satırları seçiyorsunuz, ama sadece ilkini seçiyorsunuz? Hangi "maksimize" satırını seçmezseniz, belki de x.Where (...) 'i (x.Max (...) ile First() değiştirmeniz gerekir. –

+0

@ Vlad: Bunu bir cevap olarak ekle ve kabul edeceğim. Mantıklı gelir. –

+1

'x.Max (...)' tüm satırı geri döndürmez - sadece maksimum değer. –

cevap

15

Bir alternatif kullanmak olacaktır. (Bu LINQ nesnelere de felaket olur, ancak bu durumda :) önceki sürümü için

(Özür içinde MoreLINQ den MaxBy kullanabilirsiniz -. Ben tamamen gruplaşma biraz kavramış olmasaydı)

+0

Biraz konu dışı ama ... Bir örnek yayınlayabilir veya MoreLINQ'u görebildiğimiz bir yeri bağlayabilir misiniz? Bu MaxBy beni gerçekten heyecanlandırdı. –

+0

@Alex: Sadece örnek kod mu demek istiyorsun? Bu durumda 'rows.Select (x => x.MaxBy (y => y.StartDate)') olur - ama bu şeylerin bir "vitrin" 'e sahip değiliz. Bu da belki de ... –

+0

Bu iyi bir seçenek, ancak daha verimli çalışma zamanı TSQL ile sonuçlanan söylemek zor. Kendi çözümün zaten oldukça iyi. Oluşturulan TSQL'in neye benzediğini bulmak için her ikisini de hata ayıklayıcısından çalıştırdım, sonra SQL Management Studio'yu doğrudan çalıştırabilir ve yürütme planlarına bir göz atabilir ve hatta performans analizcisi ve/veya profiler aracılığıyla da çalıştırabilirim. . –

0

yapmayın SQL'in Linq olup olmadığını bilmek, ancak, eğer SQL'de bir rank() işleviyle (her bir gruba tarihe göre sırala, sonra her birinden birinci sıradaki satırı seç) alternatif olarak gerçekleştirebilirsiniz, sonra bunu saklı proc olarak adlandırın. LINQ. İnsanların LINQ2SQL'in sınırlarını vurdukça daha idiyomik bir yaklaşım olduğunu düşünüyorum ...