2013-02-07 32 views
5

SQL Server'da LINQ kullanarak sorgulamayı umduğum bir tablom var. Tablonun bir belirsiz açıklama:Her bir anahtar için maksimum değere sahip satırı bulun

ID1 | ID2 | SomeData 
----------------------------- 
    1 | 1 | 'Moo' 
    1 | 2 | 'Meow' 
    1 | 3 | 'Woof' 
    1 | 4 | 'Cheap' 
    2 | 1 | 'Quack' 
    2 | 2 | 'Grrrrr' 
    2 | 3 | 'Wan wan' 

Ben sıralar halinde sadece ilgileniyorum ID2ID1 Örnek sonuçları istenilen başına en büyük değerdir:

1 | 4 | 'Cheap' 
    2 | 3 | 'Wan wan' 

bu SQL kodu ile geldi:

SELECT * 
FROM SomeTable a 
INNER JOIN 
(
    SELECT ID1, MAX(ID2) as SomeName 
    FROM SomeTable 
    GROUP BY ID1 
) as b 
ON a.ID1 = b.ID1 and a.ID2 = b.SomeName 

LINQ uygulamasında uygulandığında, ayrıca bir alt sorgusuna sahip olmanız mı gerekir? Yani, veritabanını sorgulayın ve 'iç sorgu' sonuçlarıyla bir değişken yükleyin, ardından aynı tabloyu sorgulayın, ancak 'iç sorgu'dan gelen değerlerle karşılaştırın? Bunu bir süreliğine tamir edip edemeyeceğimi biliyorum, sonunda alacağım, ama sanırım LINQ'da bunu yapmak gerçekten hoş bir yol olabilir.

İstenen yanıt, uzantı yöntemi sözdizimini kullanacaktır.

Bonus: Uzantı yöntemi sözdizimi dönüştürücüsüne herhangi bir standart LINQ sözdizimi türü var mı? LINQ ifadeleriyle oynamak için hangi araçları kullanıyorsunuz? Bana bir LINQ sorgusu ile oynamak için tüm C# (ASP.NET MVC benim için) gerektirecek biraz hantal görünüyor.

+4

LinqPad, LINQ deyimleriyle oynamak için harika! http://www.linqpad.net/ (Ve genel olarak C# kodu ile de oynuyor) – driis

+2

Kesinlikle [** LINQPad **] 'nin bir kopyasını alın (http://www.linqpad.net/). – mellamokb

cevap

11

düz yol:

var result = db.SomeTable.GroupBy(x => x.ID).Select(g => g.OrderByDescending(x => x.ID2).First()); 

Değil önemlidir eğer favori profilci ile kontrol böylece bu, çevirir ne kadar etkili SQL tamamen emin!

+0

Bu harika! En aza indirerek ve en iyi sonucu al. Yine de diğer cevapları görmekle ilgilenirim – Jeff

İlgili konular