2010-03-02 2 views
1

이 쿼리는 이미 배포 한 코드베이스에 있습니다. 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를 강요하여이 문제를 해결할 수있는 방법이 있습니까?

도움을 주셔서 감사합니다.

+1

찾을 여기에 버그 리포트 : https://connect.microsoft.com/VisualStudio/feedback/details/366011/linq-to-sql-query-translator-produces-syntactically-incorrect -t-sql-from-datetime-date-method –

답변

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 공급자를 강제하는 방법을 알고있다. –

관련 문제