我可以强制LINQ到SQL中使用Sql2005Provider(Can I force Linq t

2019-10-20 03:09发布

这个查询(或者更确切地说,一个类似于它)是在我们已经部署了一个代码库。

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

DB是连接到数据库的DataContext的。 TimeBlocks是一个相当简单的表格,起始日期是DateTime列。

目前,该数据库托管在一个SQL Server 2005安装,但我们在升级到SQL Server 2008的安装过程。

查询目前exectutes没有问题。

如果我们改变了连接字符串在SQL Server 2008中(与2005年成立的兼容性级别)查询失败与SQLEXCEPTION上运行同一数据库的副本点:

“日期部分毫秒不受DATEADD用于数据类型日期日期功能的支持。”

这似乎是因为当它连接到2008分贝通过发出的LINQ到SQL不同的SQL(我想这是因为它使用Sql2008Provider代替Sql2005Provider的)。

2005年供应商产生良好的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这个分贝克服这个问题?

感谢您的帮助,您可以给我们!

Answer 1:

在我看来,你发现了一个bug在LINQ to SQL。 你应该报告给微软。 你可以在这里: http://connect.microsoft.com/



文章来源: Can I force Linq to Sql to use Sql2005Provider