Могу ли я заставить Linq to Sql использовать Sql2005Provider - PullRequest
1 голос
/ 02 марта 2010

Этот запрос (или, скорее, аналогичный ему) находится в базе кода, которую мы уже развернули.

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 не поддерживается функцией dateadd для типа данных date."

Похоже, это связано с тем, что при подключении к 2008db SQL-файл, передаваемый Linq в SQL-файл, отличается от 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

, который успешно выполняет запрос. Однако sql испускается поставщиком Sql2008:

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 Ответ

1 голос
/ 02 марта 2010

Мне кажется, вы нашли ошибку в LINQ to SQL. Вы должны сообщить об этом в Microsoft. Вы можете сделать это здесь: http://connect.microsoft.com/

...