이 쿼리는 이미 배포 한 코드베이스에 있습니다. Linq가 Sql2005Provider를 사용하도록 Sql2005Provider를 강제로 적용 할 수 있습니까?
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 설치로 업그레이드하는 중입니다.
쿼리가 현재 문제없이 실행됩니다.
우리는 쿼리가 SQLEXCEPTION 실패 (2005 년에 설정된 호환성 수준) SQL 서버 2008에서 실행되는 동일한 데이터베이스의 복사본을 가리 키도록 연결 문자열을 변경하는 경우 :
는 "날짜 부분의 밀리 세컨드가 아닌 데이터 형식 날짜에 대한 날짜 함수 dateadd가 지원됩니다. "
이것은 Linq가 2008db에 연결할 때 SQL에 발생하는 다른 sql 때문인 것으로 보입니다 (Sql2005Provider 대신 Sql2008Provider를 사용하기 때문입니다). 성공적으로 쿼리를 실행
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
:
2005 제공자 좋은 SQL을 생성합니다. 그러나 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 공급자라고 생각합니까?
이 db에 대해 Sql2005Provider를 사용하도록 DataContext를 강요하여이 문제를 해결할 수있는 방법이 있습니까?
도움을 주셔서 감사합니다.
찾을 여기에 버그 리포트 : https://connect.microsoft.com/VisualStudio/feedback/details/366011/linq-to-sql-query-translator-produces-syntactically-incorrect -t-sql-from-datetime-date-method –