Es Aggregate
consulta de VB.NET fatalmente defectuoso cuando se utiliza como la primera cláusula (exterior) de una expresión LINQ con múltiples cláusulas Into
porque cada cláusula Into
se ejecuta por separado?¿El agregado tiene una falla fatal porque cada cláusula en se ejecuta por separado?
La respuesta "obvia" para SELECT MIN(ZoneMin), MAX(ZoneMin) FROM Plant
in LINQ to SQL es
Dim limits = Aggregate p In Plants Select p.ZoneMin Into Min(), Max()
Sin embargo, esta respuesta realmente lo recupere cada uno de Min
y Max
(y si se incluyen otras funciones agregadas como Count
y Average
) en consultas SQL separadas . Esto se puede ver fácilmente en LINQPad.
¿Hay alguna transacción (u otra cosa que haga que estas consultas sean atómicas) que LINQPad no muestra, o esta es una condición de carrera que está por ocurrir? (Y entonces tiene que hacer los trucos que se muestran en la respuesta a la pregunta anterior para forzar una sola consulta que devuelve múltiples agregados).
En resumen, ¿hay una consulta LINQ-to-SQL usando Aggregate
que devuelve múltiples agregados funciones en una sola consulta (o al menos "atómica")?
(Me dicen también "evidente" debido a que la respuesta obvia a mí, Aggregate p In Plants Into Min(p.ZoneMin), Max(p.ZoneMin)
, realmente lo recupere toda la mesa dos veces, incluso cuando optimizado, y luego utiliza el LINQ-a-Entidades Min
y Max
para obtener el resultado: -()
pensé Aggregate
no era VB-específica, pero parece que C# no tiene esta expresión de consulta, por lo que he cambiado el .net a vb.net
Es posible que pueda verificar si las consultas están en una transacción rastreando el servidor SQL en sí, debe mostrarlo (pero no estoy 100% seguro de ello). Sin embargo, si el rendimiento no es una preocupación primordial, es mejor que lea todo el conjunto de datos y lo agregue luego (básicamente, trabajando en una instantánea de los datos). – Alex
Tenga en cuenta que eso es lo que esperaba que mi consulta original 'Into Min (p.ZoneMin)' optimizara, ya que la parte SQL de la consulta ahora es la misma. Quizás JITter aún pueda ver eso, pero LINQPad's/o + no lo hizo. –
Y mientras solo agrega funciones que SQL admite, será preferible hacer la "agrupación por un truco constante" para hacer que la base de datos haga la agregación. –