1

このクエリ (またはそれに類似したクエリ) は、既に展開されているコードベースにあります。

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 を強制することで、この問題を回避する方法はありますか?

ご協力いただきありがとうございます。

4

1 に答える 1

1

LINQ to SQL でバグを見つけたようです。Microsoft に報告する必要があります。ここでそれを行うことができます: http://connect.microsoft.com/

于 2010-03-02T08:54:44.830 に答える