2011-01-12 14 views
11

Esta consulta SQL bastante simple resulta bastante desconcertante cuando se intenta desde LINQ.`SELECT MIN (ZoneMin), MAX (ZoneMin) FROM Plant` como LINQ to SQL

Tengo una tabla de SQL Plant con la columna ZoneMin.

Quiero encontrar el mínimo y el máximo de los valores en la columna.
La respuesta de T-SQL es bastante simple:

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

¿Qué es una consulta LINQ que podía conseguirme a esta (o alguna similar) de SQL?

He hecho varios intentos en .Agregar() y .GroupBy() sin suerte. También he analizado varias preguntas de SO que parecen similares.

Esto podría lograrse simplemente con métodos aplicados a una matriz resultante, pero no debería necesitar transportar un valor de cada fila de SQL cuando es tan simple en T-SQL.

Respuesta

14

Para lograr el mismo rendimiento que su consulta original, necesitará usar la agrupación (por una constante para minimizar el impacto, por ejemplo, 0), para que pueda consultar el mismo conjunto de registros dos veces en la misma consulta. El uso del nombre de la tabla provoca una nueva consulta para cada referencia. Pruebe lo siguiente:

(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() 

Esto produce la siguiente consulta:

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

Y después de que el optimizador se hace con ella, escupe algo equivalente a la consulta, al menos de acuerdo con SQL Server Management Studio .

+0

¡Bien hecho! Gracias Allon. Tiendo a olvidarme de probar el truco del "grupo por constante". – Peter

+2

@Peter: Entonces estás por delante de mí. Ni siquiera he oído hablar de este truco antes de investigar tu pregunta. –