Entity Framework–在Linq中使用SQL內建Function

Entity Framework–在Linq中使用SQL內建Function

在Entity Framework 4後針對Linq執行SQL內建Function提供一套機制.提供了一些介面讓Connection Provider能夠將Linq function轉譯成特定的SQL語法.

譬如底下範例的SQL GETDATE()這個內建函式

 

            using (TestEntities dc = new TestEntities())
            {
                var q = dc.tb_Person.Select(p => new { SQLDate = SqlFunctions.GetDate() });
                Console.WriteLine(((ObjectQuery)q).ToTraceString());
            }

使用方式很簡單透過SQL Provider提供的SqlFunctions這個class中的方法即可.

最後輸出SQL語法如下

image

在輸出中可看到SqlFunctions.GetDate已經正確的轉換為GETDATE語法.
透過此方式可以在任何Linq Query中穿插你要的SQL Functions.

 

這邊要注意的一點是上面的GETDATE由於是MSSQL的T-SQL語法故必須由SQL Proiver提供,所以在使用時必須加入

using System.Data.Objects.SqlClient;
相對的如果是其他的資料庫則必須Provider也要提供對應作法,也就是Provider本身必須要支援EntitFramework4之功能.
 
另外一些標準的SQL Function因為與特定Provider無關故都納於EntityFunctions這個class內而使用時必須先加上
using System.Data.Objects;
 
最後注意一點,因為採用了特定Function後會與Provider綁定,故會失去EF本身的跨資料庫好處,如果有跨資料庫需求則必須在架構程式時考量這一點,
透過如Facotry樣式來產生不同的EntityQuery來解決此問題.