此查询(或者更类似于它)位于我们已部署的代码库中。
var timeblocks = from tb in DB.TimeBlocks
where tb.StartDate.Date.AddDays(1) <= DateTime.Today
select tb.Id;
DB是连接到数据库的datacontext。 TimeBlocks是一个相当简单的表,StartDate是一个DateTime列。
目前,数据库托管在Sql Server 2005安装上,但我们正在升级到Sql Server 2008安装。
查询目前没有问题。
如果我们将连接字符串更改为指向在Sql Server 2008上运行的同一数据库的副本(并且为2005设置了兼容级别),则查询将失败并显示SqlException:
“数据类型日期的日期函数dateadd不支持datepart毫秒。”
这似乎是由于Linq连接到2008db时SQL发出的不同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来解决这个问题?
感谢您提供任何帮助!
答案 0 :(得分:1)
在我看来,您在LINQ to SQL中发现了一个错误。您应该将其报告给Microsoft。您可以在此处执行此操作:http://connect.microsoft.com/