1. 程式人生 > >C#實踐問題:如何在LINQ to Entities 查詢中,計算兩個日期之間相差的天數?

C#實踐問題:如何在LINQ to Entities 查詢中,計算兩個日期之間相差的天數?

在LINQ to Entities 查詢中,使用常規日期格式轉換函式Convert.ToDateTime()以及日期比較函式TimeSpan.Subtract().Days,都很麻煩而且會出錯:LINQ to Entities不能識別方法。。。

那麼要想在LINQ to Entities 查詢中,計算兩個日期之間相差的天數,該怎麼辦呢?

別慌,.NET已經為你準備好了工具!

System.Data.Entity提供公共語言執行時(CLR)方法,公開EDM規範函式。
用於System.Data.Entity.DbContext或System.Data.Entity.Core.Objects.ObjectContext。
LINQ to Entities查詢。

名稱空間 System.Data.Entity 包含許多有用的方法,每一類方法都包含好多個過載方法。其中包括但不限於:

AddDays: public static DateTime? AddDays(DateTime? dateValue, int? addValue);

摘要:
         //當用作LINQ to Entities查詢的一部分時,此方法將呼叫規範
         // AddDays EDM功能可將給定天數新增到日期/時間。
        //
         //引數:
         // dateValue:
         //輸入日期/時間。
        //
         // addValue:
         //要新增的天數。
        //
         //返回結果:
         //結果日期/時間。
        //
         //備註:
         //你不能直接呼叫這個函式。 此功能只能出現在
         //一個LINQ to Entities查詢。 此功能轉換為相應的功能
         //在資料庫中

 

AddHours:public static TimeSpan? AddHours(TimeSpan? timeValue, int? addValue);

//
         //摘要:
         //當用作LINQ to Entities查詢的一部分時,此方法將呼叫規範
         // AddHours EDM功能可將給定的小時數新增到時間跨度。
        //
         //引數:
         // timeValue:
         //輸入日期/時間。
        //
         // addValue:
         //要新增的小時數。
        //
         //返回結果:
         //結果時間跨度
        //
         //備註:
         //你不能直接呼叫這個函式。 此功能只能出現在
         //一個LINQ to Entities查詢。 此功能轉換為相應的功能
         //在資料庫中

以及AddMicroseconds,AddMinutes,AddMonths等以Add開頭的方法就不一一介紹了,感興趣的可以用vs自行檢視。

AsNonUnicode:public static string AsNonUnicode(string value);

//
         //摘要:
         //當用作LINQ to Entities查詢的一部分時,此方法充當運算子
         //確保輸入被視為非Unicode字串。
        //
         //引數:
         //值:
         //輸入字串
        //
         //返回結果:
         //輸入字串被視為非Unicode字串。
        //
         //備註:
         //你不能直接呼叫這個函式。 此功能只能出現在
         //一個LINQ to Entities查詢。 此函式會影響LINQ查詢的轉換方式
         //可以在資料庫中執行的查詢。

以及AsUnicode。

DiffDays:public static int? DiffDays(DateTime? dateValue1, DateTime? dateValue2);

//
         //摘要:
         //當用作LINQ to Entities查詢的一部分時,此方法將呼叫規範
         // DiffDays EDM函式用於計算兩個日期/時間之間的天數。
        //
         //引數:
         // dateValue1:
         //第一個日期/時間
        //
         // dateValue2:
         //第二個日期/時間
        //
         //返回結果:
         //第一個和第二個日期/時間之間的天數。
        //
         //備註:
         //你不能直接呼叫這個函式。 此功能只能出現在
         //一個LINQ to Entities查詢。 此功能轉換為相應的功能
         //在資料庫中

以Differ開頭的方法也有很多,就不一一介紹了。

這裡有一個問題,上述的DiffDays方法能返回兩個日期之間相差的天數,但是並沒有強調順序,也就是說傳入兩個日期,雖然能知道相隔的天數,但是卻不知道誰比誰多。

同樣是相隔兩天,早兩天和晚兩天,意義上可能就差很多。

所以要根據自己的需要,靈活的使用各種工具方法。

不過,雖然文件中沒有指出兩個引數的順序對結果的影響,但是經過實踐,得知:第二個引數與第一個引數比較,大則為正,相等則為零,小則為負。