Linq查询返回不正确的结果集

Bob*_* Mc 6 .net linq sql-server linq-to-sql

我有一个非常复杂的Linq to SQL查询,它从Microsoft SQL Server数据库返回结果集.使用类似于以下语法创建查询:

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()
Run Code Online (Sandbox Code Playgroud)

查询有几个用户指定的过滤器,包括进行地理半径搜索的过滤器.

这是问题所在.我在最后的"ToList"调用中设置了一个中断.当中断命中时,我使用Linq to SQL Debug Visualizer查看生成的SQL语句.我将该复杂的SQL语句复制到SQL Server Management Studio查询窗口中,并对我的数据库执行它以获得我想要的结果集.因此生成的SQL似乎产生了所需的结果.但是,当我执行查询对象的"ToList"方法时,返回的列表具有较少的行和一些不同的行.我也尝试使用DataContext日志属性写入文件,结果相同.该查询在SQL Management Studio中生成正确的结果集,但ToList方法的结果不正确.

怎么可能?如果生成的SQL只是通过与SQL Server的连接传递,那么它不应该生成我在SQL Server Management Studio中看到的结果集吗?我假设我误解了Linq to SQL机制,即它不仅仅是SQL Server的一个直通.那是对的吗?

编辑: 根据下面的请求,这是由Linq生成的SQL的一个非常简洁的版本,为简洁起见,删除了大多数结果列.它在SQL Management Studio中生成正确的结果,但返回到我的应用程序的结果是不同的.

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]
Run Code Online (Sandbox Code Playgroud)

更新 2009-11-17能够就此问题与MS联系.创建了一个示例应用程序,我将其提交给他们的支持代表.他们重复了这个问题,正在研究中.当我得到回复时会发布回答.

更新 2009-12-21最后在微软的帮助下得到了正确的答案.请参阅下面我接受的答案以获得解释.

Bob*_* Mc 2

好吧,经过与 Microsoft 非常乐于助人的支持代表的反复讨论,我们终于找到了问题的根源。不幸的是,我在原来的帖子中没有提供足够的信息供任何人做出决定,所以我在这方面表示歉意。

问题是 - 作为构造相关 LINQ 查询的代码的一部分,我声明了一个 .Net 变量,如下所示:

Dim RadCvtFactor As Decimal = Math.PI / 180
Run Code Online (Sandbox Code Playgroud)

事实证明,当将其传递给 SQL 时,参数声明(如 LINQ 日志文件中所示)为 DECIMAL( 29, 4 )。由于声明上的比例值,无效值被传递到 RDBMS,导致查询结果出现奇怪的差异。

将 .Net 变量声明为 Single 值,如下所示:

Dim RadCvtFactor As Single = Math.PI / 180
Run Code Online (Sandbox Code Playgroud)

彻底纠正问题。

微软代表承认此参数转换可能是一个“潜在问题”,并将咨询产品团队。

感谢所有提交答案的人。