2013-11-27 43 views
0

I'm使用非常有用的擴展方法忽略這裏列出的日期時間比較討論數據庫毫秒:How to truncate milliseconds off of a .NET DateTime如何添加用於EF和LINQ查詢的DateTime擴展方法?

我的代碼變成如下所示:

{ 
    /// <summary> 
    /// Helpers to handle DateTime comparasion, as storing and retrieving form DB will change number of Ticks. 
    /// </summary> 
    public static class DateTimeHelper 
    { 

     /// <summary> 
     /// This function will truncate the datetime to the given TimeSpan for comparasion. 
     /// </summary> 
     /// <param name="dateTime">Datetime to truncate</param> 
     /// <param name="timeSpan">Timespan to be used</param> 
     /// <returns></returns> 
     public static DateTime Truncate(this DateTime dateTime, TimeSpan timeSpan) 
     { 
      return dateTime.AddTicks(-(dateTime.Ticks % timeSpan.Ticks)); 
     } 
    } 
} 

而且我想使用它的EF和LINQ從數據庫中獲取數據:

HISDATASET savedObject = dbContext.HISDATASET.FirstOrDefault(record => record.DSSTARTDATETIME.Truncate(TimeSpan.FromMilliseconds(1)) == dbControl.DSSTARTDATETIME.Truncate(TimeSpan.FromMilliseconds(1)) && 
                  record.DSENDDATETIME.Truncate(TimeSpan.FromMilliseconds(1)) == dbControl.DSENDDATETIME.Truncate(TimeSpan.FromMilliseconds(1))); 

I'm越來越運行時,此錯誤:

LINQ to Entities無法識別表達式「System.DateTime 截斷(System.DateTime,System TimeSpan)」,該表達式無法在存儲庫表達式「(已翻譯)上轉換 」。

我想能夠在我的數據庫查詢中調用我的擴展方法。我該如何解決這個問題?

感謝您的幫助....

[編輯 - 最終代碼]

這解決了我,但我didn't非常喜歡的解決方案......不是因爲DiffSeconds用法,但因爲它永遠不會返回0.因此,與零比較不起作用。我不得不調整它以接受至少1秒的差異(< = 1),並且他們經歷了。

HISDATASET savedObject = dbContext.HISDATASET.FirstOrDefault(record => EntityFunctions.DiffSeconds(record.DSSTARTDATETIME, dbControl.DSSTARTDATETIME) <= 1 && EntityFunctions.DiffSeconds(record.DSENDDATETIME, dbControl.DSENDDATETIME) <= 1); 

應該有一個更好的方法來比較DateTime變量與數據庫字段......無論如何,感謝您的幫助。

回答

2

您可以使用附帶的EntityFunction之一

DiffMilliseconds

EntityFunctions.DiffMilliseconds(dateTime1, dateTime2) < someNumber 

或可能使用DiffSeconds會更好

EntityFunctions.DiffSeconds(dateTime1, dateTime2) == 0 
+1

而在EF6 - 從https://entityframework.codeplex。 com/wikipage?title =更新%20Applications%20to%20use%20EF6 System.Data.Objects.EntityFunctions => System.Data.Entity.DbFunctions(請注意,命名;一個具有舊名稱的類仍然存在並且可行,但它現在已標記爲過時。) – Colin

+0

忘記提及我正在使用Oracle。我找不到要包含的System.Data.Objects。我應該安裝EF以外的東西嗎? – Mendes

+0

@Mendez - 甲骨文應該沒關係。根據Colin的評論,如果您使用EF6,您需要遵循他的評論。希望有所幫助。 – Aducci

0

不幸的是,EF無法理解您的.NET代碼並生成SQL,從而得出相同的結果。 LINQ to Entites中使用的每個表達式都必須轉換爲SQL,並且EF只支持簡單的表達式。