2010-07-14 56 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到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

有什麼聰明的方法來查詢動態查詢中的特定參數(事先不知道)?或者,我必須用'datetime2'替換所有'datetime'? – 2010-07-14 20:47:12

2

打開您的.dbml文件,並選擇屬性(Changes.Date)。

打開它的屬性頁(Alt-Enter)。有一個「服務器數據類型」屬性,您可以更改。

保存&重建。

+0

Changes.Date具有服務器的數據類型'DATETIME2不NULL'。 – 2010-07-14 15:52:30

+0

這個問題可能會導致它將'SqlMethods.DateDiffNanosecond'不直接轉換到Changes.Date ... – 2010-07-14 16:00:59