【问题标题】:Can I force Linq to Sql to use Sql2005Provider我可以强制 Linq to Sql 使用 Sql2005Provider
【发布时间】:2010-03-02 03:40:18
【问题描述】:

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

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 不支持 datepart 毫秒,用于数据类型 date。”

这似乎是由于 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 为这个 db 使用 Sql2005Provider 来解决这个问题?

感谢您为我们提供的任何帮助!

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2011-08-24
  • 2010-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多