這個查詢(或者更類似於它)位於我們已經部署的代碼庫中。我可以強制Linq to Sql使用Sql2005Provider
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安裝過程。
該查詢當前exectutes沒有問題。
如果我們更改連接字符串在SQL Server 2008中運行相同的數據庫的副本(與兼容性水平2005年成立),以點查詢失敗與SQLEXCEPTION:
「的日期部分毫秒不由日期函數dateadd支持數據類型日期。「
這似乎是由於Linq到SQL連接到2008db時發出的不同的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來解決這個問題?
感謝您給我們提供的任何幫助!
發現此問題的報告: https://connect.microsoft.com/VisualStudio/feedback/details/366011/linq-to-sql-query-translator-produces-syntactically-incorrect -t-sql-from-datetime-date-method – 2010-03-02 20:18:54