2010-07-14 3 views
2

У меня есть простой запрос в LINQ к SQL:Как заставить LINQ to SQL передавать .NET DateTime как datetime2?

var id = 23479824; 
var date = Changes.Where(ch => ch.Id == id).First().Date; 
var diff = Changes.Where(ch => ch.Id == id).Select(ch => SqlMethods.DateDiffNanosecond(date, ch.Date)).First(); 

diff Переменная должна быть равна нулю, однако это не так. Генерируется SQL-имеет следующий вид:

DECLARE @p0 DateTime = '2010-07-14 15:05:49.207' 
DECLARE @p1 Int = 44633 

SELECT TOP (1) [t1].[value] 
FROM (
    SELECT DATEDIFF(Nanosecond, @p0, [t0].[Date]) AS [value], [t0].[Id] 
    FROM [dbo].[Changes] AS [t0] 
    ) AS [t1] 
WHERE [t1].[Id] = @p1 
GO 

Я обнаружил, что это вызвано LINQ к SQL, который проходит .NET DateTime типа как SQL datetime. Однако столбец Date имеет тип SQL datetime2.

Это ошибка в LINQ to SQL или функция? Как заставить LINQ to SQL передавать дату ввода как datetime2?

ответ

1

Если вы не возражаете, выскакивают капот, вы можете сделать это:

DbCommand dbCommand = dataContext.GetCommand(query); 

dbCommand.Parameters ... 

dbParameter.DbType = System.Data.DbType.DateTime2; 

DbDataReader reader = command.ExecuteReader(); 

IEnumerable<ResultType> result = dataContext 
    .Translate<ResultType>(reader); 
+0

Есть ли какой-нибудь умный способ поиска определенного параметра в динамическом запросе (неизвестно заранее)? Или я должен заменить все 'datetime' на' datetime2'? –

2

Откройте ваш .dbml-файл и выберите свойство (Changes.Date).

Открыть страницу свойств (Alt-Enter). Существует свойство «Тип данных сервера», которое вы можете изменить.

Сохранить & Восстановленный.

+0

Changes.Date имеет тип сервера данных 'Datetime2 NOT NULL'. –

+0

Проблема может быть вызвана тем, что она будет 'SqlMethods.DateDiffNanosecond' не напрямую на Changes.Date ... –

Смежные вопросы