1

这个查询(或者类似的查询)在我们已经部署的代码库中。

var timeblocks = from tb in DB.TimeBlocks
    where tb.StartDate.Date.AddDays(1) <= DateTime.Today
    select tb.Id;

DB 是连接到数据库的数据上下文。TimeBlocks 是一个相当简单的表,StartDate 是一个 DateTime 列。

目前,数据库托管在 Sql Server 2005 安装上,但我们正在升级到 Sql Server 2008 安装。

查询当前执行没有问题。

如果我们将连接字符串更改为指向在 Sql Server 2008 上运行的同一数据库的副本(兼容性级别设置为 2005),则查询将失败并出现 SqlException:

“日期函数 dateadd 不支持数据类型 date 的 datepart 毫秒。”

这似乎是由于 Linq to SQL 在连接到 2008db 时发出的不同 sql(我认为这是因为它使用 Sql2008Provider 而不是 Sql2005Provider)。

2005 Provider 产生良好的 SQL:

SELECT [t0].[Id]
FROM [dbo].[TimeBlock] AS [t0]
WHERE DATEADD(ms, (CONVERT(BigInt,@p0 * 86400000)) % 86400000, DATEADD(day, (CONVERT(BigInt,@p0 * 86400000)) / 
    86400000, DATEADD(HOUR, -DATEPART(HOUR, [t0].[StartDate]), DATEADD(MINUTE, -DATEPART(MINUTE, 
        [t0].[StartDate]), DATEADD(SECOND, -DATEPART(SECOND, [t0].[StartDate]), DATEADD(MILLISECOND,
        -DATEPART(MILLISECOND, [t0].[StartDate]), [t0].[StartDate])))))) <= @p1

成功执行查询。但是Sql2008Provider发出的sql:

SELECT [t0].[Id]
FROM [dbo].[TimeBlock] AS [t0]
WHERE DATEADD(ms, (CONVERT(BigInt,@p0 * 86400000)) % 86400000, DATEADD(day, (CONVERT(BigInt,@p0 * 86400000)) /
 86400000, CONVERT(DATE, [t0].[StartDate]))) <= @p1

包含导致异常的错误 sql。

我认为是导致此问题的 Sql 提供程序是否正确?

有没有办法通过强制 DataContext 为这个数据库使用 Sql2005Provider 来解决这个问题?

感谢您能给我们的任何帮助!

4

1 回答 1

1

在我看来,您在 LINQ to SQL 中发现了一个错误。您应该向 Microsoft 报告。你可以在这里做到这一点:http ://connect.microsoft.com/

于 2010-03-02T08:54:44.830 回答