このクエリ (またはそれに類似したクエリ) は、既に展開されているコードベースにあります。
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 で失敗します。
「datepart ミリ秒は、データ型 date の日付関数 dateadd ではサポートされていません。」
これは、Linq が 2008db に接続するときに SQL に発行する異なる sql が原因のようです (これは、Sql2005Provider の代わりに Sql2008Provider を使用しているためだと思います)。
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 プロバイダーであると考えるのは正しいですか?
このデータベースに Sql2005Provider を使用するように DataContext を強制することで、この問題を回避する方法はありますか?
ご協力いただきありがとうございます。