2010-03-02 11 views
1

這個查詢(或者更類似於它)位於我們已經部署的代碼庫中。我可以強制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來解決這個問題?

感謝您給我們提供的任何幫助!

+1

發現此問題的報告: 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

回答

1

在我看來,你發現一個LINQ to SQL的錯誤。您應該將其報告給Microsoft。你可以這樣做:http://connect.microsoft.com/

+1

啊,對,謝謝。是的,我應該先看看那裏。 https://connect.microsoft.com/VisualStudio/feedback/details/366011/linq-to-sql-query-translator-produces-syntactically-incorrect-t-sql-from-datetime-date-method 這就是錯誤,固定在4.0。大幫助:( 不過,我會留下這個問題,讓別人知道如何強制2005提供商。 – 2010-03-02 20:18:23