这个查询(或者类似的查询)在我们已经部署的代码库中。
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 来解决这个问题?
感谢您能给我们的任何帮助!