Tengo una consulta de Linq a SQL muy compleja que devuelve un conjunto de resultados de una base de datos de Microsoft SQL Server. La consulta se crea utilizando una sintaxis similar a:La consulta de Linq devuelve un resultado incorrecto Conjunto
Dim db as MyDataContext = MyGetDataContextHelper()
Dim qry = From rslt in db.MyView Select ColumnList
If userParam1 IsNot Nothing Then
qry = qry.Where(lambda for the filter)
End If
etc....
Return qry.ToList()
Hay varios filtros especificados por el usuario a la consulta, incluyendo uno que hace una búsqueda radio geográfico.
Aquí está el problema. Tengo un descanso establecido en la llamada "ToList" justo al final. Cuando se golpea la ruptura, utilizo el Visualizador de depuración de SQL para ver la declaración SQL generada. Copio esa declaración SQL compleja en una ventana de consulta de SQL Server Management Studio y la ejecuto contra mi base de datos para obtener exactamente el conjunto de resultados que deseo. Entonces, el SQL generado parece producir el resultado deseado. Sin embargo, cuando ejecuto el método "ToList" del objeto de consulta, la lista devuelta tiene menos filas y algunas filas diferentes. También he intentado esto usando la propiedad de registro DataContext escribiendo en un archivo, con el mismo resultado. La consulta genera el conjunto de resultados correcto en SQL Management Studio, pero resultados incorrectos del método ToList.
¿Cómo puede ser eso? Si el SQL generado simplemente se transfiere a través de la conexión al servidor SQL, ¿no debería generar exactamente el conjunto de resultados que veo en SQL Server Management Studio? Supongo que estoy malinterpretando algo sobre el mecanismo de Linq a SQL, es decir, que no se trata simplemente de un traspaso a SQL Server. ¿Es eso correcto?
EDIT: De acuerdo con una solicitud a continuación, aquí es una versión muy condensada del SQL que se genera por LINQ, con la mayoría de las columnas de resultados extraídos por razones de brevedad. Produce el resultado correcto en SQL Management Studio, pero el resultado devuelto a mi aplicación es diferente.
SELECT [t3].[Id]
FROM (
SELECT DISTINCT [t1].[Id]
FROM (
SELECT [t0].[Id], [t0].[ItemDate]
FROM [dbo].[MySearchView] AS [t0]
) AS [t1]
WHERE (EXISTS(
SELECT NULL AS [EMPTY]
FROM [dbo].[ZipCoverage] AS [t2]
WHERE ([t2].[Id] = [t1].[Id])
AND ([t2].[Latitude] >= (41.09046 - (0.5)))
AND ([t2].[Latitude] <= (41.09046 + (0.5)))
AND ([t2].[Longitude] >= (-73.43106 - (0.5)))
AND ([t2].[Longitude] <= (-73.43106 + (0.5)))
AND (ABS(3956.08833132861 * 2 * ATN2(SQRT(POWER(SIN((((CONVERT(Float,CONVERT(Float,0.0174532925199433))) * [t2].[Latitude]) - 0.717163818159029)/(CONVERT(Float,2))), 2) + (COS(0.717163818159029) * COS((CONVERT(Float,CONVERT(Float,0.0174532925199433))) * [t2].[Latitude]) * POWER(SIN((((CONVERT(Float,CONVERT(Float,0.0174532925199433))) * [t2].[Longitude]) - -1.28161377022951)/(CONVERT(Float,2))), 2))), SQRT((1 - POWER(SIN((((CONVERT(Float,CONVERT(Float,0.0174532925199433))) * [t2].[Latitude]) - 0.717163818159029)/(CONVERT(Float,2))), 2)) + (COS(0.717163818159029) * COS((CONVERT(Float,CONVERT(Float,0.0174532925199433))) * [t2].[Latitude]) * POWER(SIN(((CONVERT(Float,CONVERT(Float,0.0174532925199433))) * [t2].[Longitude])/(CONVERT(Float,2))), 2))))) <= 5)))
AND ([t1].[ItemDate] <= '11/17/2009 8:12:42 PM')
) AS [t3]
ACTUALIZACIÓN 2009-11-17 fue capaz de ponerse en contacto con EM con respecto a este tema. Creé una aplicación de muestra que presenté a su representante de soporte. Han duplicado el problema y están investigando. Publicaré respuesta cuando reciba una respuesta.
ACTUALIZACIÓN 2009-12-21 Finalmente llegué a la respuesta correcta con la ayuda de Microsoft. Por favor vea mi respuesta aceptada a continuación para la explicación.
¿Podría publicar su consulta LINQ real? Dijiste que era muy complejo. Dado que todo lo demás parece estar en orden, la opción restante es que su consulta LINQ contiene procesamiento solo en tiempo de ejecución que el traductor no pudo convertir en SQL. – jrista
He respondido a tu comentario en mi respuesta a continuación. –
¿No hay PEDIDO POR? ¿De cuántas filas estamos hablando, y cómo está validando que los resultados son diferentes? ¿Es posible que el orden sea diferente y que parezca que los resultados son diferentes? –