2011-01-12 4 views
11

Questa query SQL piuttosto semplice si sta dimostrando piuttosto sconcertante quando si tenta di eseguire il LINQ.`SELEZIONA MIN (ZoneMin), MAX (ZoneMin) FROM Plant` come LINQ a SQL

Ho una tabella SQL Plant con colonna ZoneMin.

Voglio trovare il minimo e il massimo dei valori nella colonna.
La risposta in T-SQL è abbastanza semplice:

SELECT MIN(ZoneMin), MAX(ZoneMin) FROM Plant

Che cosa è una query LINQ che mi potesse arrivare a questo (o alcuni simili) di SQL?

Ho effettuato vari tentativi su .Aggregate() e .GroupBy() senza fortuna. Ho anche esaminato diverse domande SO che sembrano simili.

Questo potrebbe essere ottenuto semplicemente con i metodi applicati a un array risultante, ma non avrei bisogno di trasportare un valore da ogni riga SQL quando è così semplice in T-SQL.

risposta

14

Per ottenere le stesse prestazioni della query originale, è necessario utilizzare il raggruppamento (con una costante per ridurre al minimo l'impatto, ad esempio 0), in modo da poter fare riferimento allo stesso set di record due volte nella stessa query. Utilizzando il nome della tabella si genera una nuova query su ciascun riferimento. Provare quanto segue:

(from plant in db.Plants 
group plant by 0 into plants 
select new { Min = plants.Min(p => p.ZoneMin), Max = plants.Max(p => p.ZoneMin) } 
).Single() 

Questo produce la seguente query:

SELECT MIN(plants.ZoneMin), MAX(plants.ZoneMin) 
FROM (SELECT 0 AS Grp, ZoneMin FROM Plants) AS plants 
GROUP BY plants.Grp 

E dopo l'ottimizzatore è fatto con esso, sputa fuori qualcosa di equivalente per la tua ricerca, almeno secondo SQL Server Management Studio .

+0

Ben fatto! Grazie Allon. Tendo a dimenticare di provare il trucco "group by a constant". – Peter

+2

@Peter: Allora sei davanti a me - Non ho mai sentito parlare di questo trucco prima di cercare la tua domanda. –