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

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

首先，我們先看看資料庫中的資料：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/e2db133081769788d579-image_3057.png)

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

**第 1 種 (錯誤寫法)**

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

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/52fed26e7dc2f89c7b7e-image_3058.png)

**第 2 種 (錯誤寫法)**

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

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/19bdd5dba60f52c65767-image_3059.png)

**第 3 種 (正確寫法)**

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

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/483a88433d6925fc2be9-image_3060.png)

**第 4 種 (使用 EF6 提供的** [**DbFunctions.TruncateTime**](https://msdn.microsoft.com/en-us/library/dn220142) **函式)**

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

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

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/f82a8f89c98ab7057ae2-image_3061.png)

**第 5 種 (使用 EF6 提供的其他** [**DbFunctions**](https://msdn.microsoft.com/en-us/library/system.data.entity.dbfunctions) **函式)**

在 Entity Framework 6 的 [DbFunctions](https://msdn.microsoft.com/en-us/library/system.data.entity.dbfunctions) 函式中還有許多內建的 EDM 函式可用，其中日期相關的函式占了大部分，還有許多其他像是字串處理、數值統計等函式可用，當你需要的時候，還是可以放心使用，建議有空可以將這些可用的函式看過一遍，在腦內建立索引，以便日後應用。

我們將上述第 2 種錯誤寫法，改用 [DbFunctions](https://msdn.microsoft.com/en-us/library/system.data.entity.dbfunctions) 函式就可以正常執行了，如下圖示：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/2deb4f68f6d7f7174fa4-image_3062.png)

**相關連結**

-   [DbFunctions.TruncateTime Method (Nullable(DateTime)) (System.Data.Entity)](https://msdn.microsoft.com/en-us/library/dn220142)
-   [DbFunctions Class (System.Data.Entity)](https://msdn.microsoft.com/en-us/library/system.data.entity.dbfunctions)
-   [Entity Framework Data Providers | Microsoft Docs](https://learn.microsoft.com/en-us/dotnet/framework/data/adonet/ef/data-providers)
