2013-02-07 17 views
5

Ho una tabella memorizzata in SQL Server che spero di eseguire una query utilizzando LINQ. Una descrizione vaga della tabella:Trova riga con valore massimo per ogni chiave

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' 

Sono interessato solo righe in cui ID2 è il massimo valore per ID1 Esempio desiderata risultati:

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

sono venuto con questo codice 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 

Quando si implementa in LINQ, è anche necessario avere una query secondaria? Cioè, interrogare il database e caricare una variabile con i risultati della "query interna", quindi eseguire una query sulla stessa tabella ma confrontarla con i valori della "query interna"? So se armeggiare con questo per un po ', lo otterrò alla fine, ma mi sembra che ci sia probabilmente un modo elegante per farlo in LINQ molto facilmente.

La risposta desiderata utilizzerà la sintassi del metodo di estensione.

Bonus: Esiste un tipo di sintassi LINQ standard al convertitore di sintassi del metodo di estensione? Quali strumenti usi per giocare con le dichiarazioni LINQ? Mi sembra un po 'ingombrante richiedere un intero C# (ASP.NET MVC per me) per giocare con una query LINQ.

+4

LinqPad è fantastico per giocare con le istruzioni LINQ! http://www.linqpad.net/ (E anche in generale con il codice C#) – driis

+2

Ottieni sicuramente una copia di [** LINQPad **] (http://www.linqpad.net/). – mellamokb

risposta

11

Il modo dritto in avanti:

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

tutto sicuro di come efficiente SQL questo si traduce in, quindi se questo è importante, controllare con il vostro profiler preferito!

+0

Questo è geniale! Ordina decrescente e ottieni il risultato migliore. Tuttavia, sarei ancora interessato a vedere altre risposte – Jeff

Problemi correlati