Comment forcer LINQ to SQL à transmettre .NET DateTime comme datetime2 ?
-
15-09-2020 - |
Question
J'ai une requête simple dans LINQ to SQL :
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();
Le diff
La variable devrait être nulle, mais ce n'est pas le cas.Le SQL généré est le suivant :
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
J'ai trouvé que cela était dû à LINQ to SQL qui transmettait .NET DateTime
tapez en SQL datetime
.Cependant, le Date
la colonne a un type SQL datetime2
.
Est-ce un bug dans LINQ to SQL ou une fonctionnalité ?Comment forcer LINQ to SQL à transmettre la date d'entrée comme datetime2
?
La solution
Si cela ne vous dérange pas d'ouvrir le capot, vous pouvez faire ceci :
DbCommand dbCommand = dataContext.GetCommand(query);
dbCommand.Parameters ...
dbParameter.DbType = System.Data.DbType.DateTime2;
DbDataReader reader = command.ExecuteReader();
IEnumerable<ResultType> result = dataContext
.Translate<ResultType>(reader);
Autres conseils
Ouvrez votre fichier .dbml et sélectionnez la propriété (Changes.Date).
Ouvrez sa page de propriétés (Alt-Entrée).Il existe une propriété « Type de données du serveur » que vous pouvez modifier.
Enregistrer et reconstruire.