我可以强制Linq到Sql使用Sql2005Provider

时间:2010-03-02 03:40:18

标签: linq-to-sql sql-server-2008 compatibility-level

此查询(或者更类似于它)位于我们已部署的代码库中。

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来解决这个问题?

感谢您提供任何帮助!

1 个答案:

答案 0 :(得分:1)

在我看来,您在LINQ to SQL中发现了一个错误。您应该将其报告给Microsoft。您可以在此处执行此操作:http://connect.microsoft.com/