2013-02-07 13 views
5

Mam tabeli przechowywanych w SQL Server, które mam nadzieję, aby kwerendy przy użyciu LINQ. Niejasny opis tabeli:Znajdź wiersz z maksymalną wartością dla każdego klucza

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' 

Jestem zainteresowany tylko w rzędach gdzie ID2 jest największa wartość za ID1 Przykład pożądane rezultaty:

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

I mają pochodzić z tego kodu SQL:

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 

Podczas implementacji w LINQ wymagane jest również dodatkowe zapytanie? Oznacza to, zapytanie do bazy danych i załadować zmienną z wynikami "zapytania wewnętrznego", a następnie zapytać o tę samą tabelę, ale porównać z wartościami z "zapytania wewnętrznego"? Wiem, że jeśli będę majstrować przy tym przez jakiś czas, w końcu to dostanę, ale wydaje mi się, że prawdopodobnie jest jakiś wymyślny sposób, aby to zrobić w LINQ naprawdę łatwo.

Pożądana odpowiedź wykorzysta składnię metody rozszerzenia.

Bonus: Czy istnieje jakiś typ standardowej składni LINQ do konwertera składni metody rozszerzającej? Jakich narzędzi używasz do gry z instrukcjami LINQ? Wydaje mi się nieco kłopotliwe, aby wymagać całego C# (ASP.NET MVC dla mnie) do odtwarzania z zapytaniem LINQ.

+4

LinqPad jest świetny do gry z instrukcjami LINQ! http://www.linqpad.net/ (I ogólnie z obsługą kodu C#) – driis

+2

Zdecydowanie zdobądź kopię [** LINQPad **] (http://www.linqpad.net/). – mellamokb

Odpowiedz

11

Prosta droga naprzód:

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

Nie do końca pewny jak skuteczne SQL przekłada się to, więc jeśli to jest ważne, sprawdź ją ze swoim ulubionym profilera!

+0

To jest genialne! Zamów przez zejście i zdobądź najlepszy wynik. Chociaż nadal chciałbym zobaczyć inne odpowiedzi – Jeff

Powiązane problemy