The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

如何利用 LINQ to Entity 查詢資料表中特定日期的資料

在使用 LINQ to Entity 查詢 Entity Framework 中的資料時,當遇到必須篩選出資料庫中特定一天的資料時,這件事就會變得有點棘手,每次遇到這個問題都得查一下才會寫,因此今天決定寫點筆記日後備查。

首先,我們先看看資料庫中的資料:

然後我們在來看你可能會寫的 LINQ to Entity 語法。

第 1 種 (錯誤寫法)

由於 Order 資料表中的 OrderDate 有包含時間,因此只傳特定一個時間點進去,甚麼都查不到!

第 2 種 (錯誤寫法)

這種寫法會立即發生 System.NotSupportedException 例外狀況,錯誤訊息會是【LINQ to Entities 無法辨識方法 'System.DateTime AddDays(Double)' 方法,而且這個方法無法轉譯成存放區運算式。】,因為 .NET 型別系統 DateTime 的 AddDays() 方法並未在 LINQ to Entity 提供者中得到支援,無法編譯成 SQL Server 可以認得的 T-SQL 語法。

第 3 種 (正確寫法)

這種寫法主要是解決第 2 種寫法遇到的困難,也就是先把起訖時間些準備好,然後再傳入 LINQ 語句中查詢,這樣就可以順利查詢了。

第 4 種 (使用 EF6 提供的 DbFunctions.TruncateTime 函式)

這個 EDM 函式是從 Entity Framework 6 才開始有的內建函式,使用前記得要先引用 System.Data.Entity 命名空間才能正常使用。

這種用法只能運用在 LINQ to Entity 的情境,而且只要是支援 Entity Framework 6 的 Entity Framework Data Provider 都會正常轉譯為各資料庫支援的 SQL 語句,這應該是比較理想的解法。

第 5 種 (使用 EF6 提供的其他 DbFunctions 函式)

在 Entity Framework 6 的 DbFunctions 函式中還有許多內建的 EDM 函式可用,其中日期相關的函式占了大部分,還有許多其他像是字串處理、數值統計等函式可用,當你需要的時候,還是可以放心使用,建議有空可以將這些可用的函式看過一遍,在腦內建立索引,以便日後應用。

我們將上述第 2 種錯誤寫法,改用 DbFunctions 函式就可以正常執行了,如下圖示:

 

相關連結

留言評論