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方法能返回兩個日期之間相差的天數,但是並沒有強調順序,也就是說傳入兩個日期,雖然能知道相隔的天數,但是卻不知道誰比誰多。
同樣是相隔兩天,早兩天和晚兩天,意義上可能就差很多。
所以要根據自己的需要,靈活的使用各種工具方法。
不過,雖然文件中沒有指出兩個引數的順序對結果的影響,但是經過實踐,得知:第二個引數與第一個引數比較,大則為正,相等則為零,小則為負。