ADO.Net Entity Framework : (十九) 如何更精確的控制 Provider 轉換後的 SQL 語法

如何使用【Query Builder Mothed】、【Entity SQL Language】來更精確的控制 Provider 轉換後的 SQL 語法

上篇介紹了EF的三種查詢方式,

  1. Linq to Entities
  2. Query Builder Mothed
  3. Entity SQL Language

這次來介紹如何使用【Query Builder Mothed】、【Entity SQL Language】來更精確的控制 Provider 轉換後的 SQL 語法

我們先看一個範例

範例一


        using (TestEntities te = new TestEntities())
        {
            ObjectQuery user = te.User.Where(a => a.User_name.StartsWith("1")) as ObjectQuery;
            Response.Write(user.ToTraceString());
        }

這語法很簡單,想到找出 User_name 開頭為 "1" 的資料清單,
一般我們都會下 


Select * from User where user_name like N'1%'

 那我們還看看 EF 幫我們轉換成甚麼,
這邊利用了ObjectQuery.ToTraceString() 來輸出最後轉換出來的SQL語法,


SELECT [Extent1].[User_id] AS [User_id]
	, [Extent1].[User_name] AS [User_name]
	, [Extent1].[User_email] AS [User_email]
	, [Extent1].[User_sysdate] AS [User_sysdate] 
FROM [dbo].[User] AS [Extent1] 
WHERE (CAST(CHARINDEX(N'd', [Extent1].[User_name]) AS int)) = 1 

 結果在條件的部分轉換成 "WHERE (CAST(CHARINDEX(N'd', [Extent1].[User_name]) AS int)) = 1 "  @@
感覺好複雜的語法,

再來看看另一個範例,利用【Query Builder Mothed】

範例二


        using (TestEntities te = new TestEntities())
        {
            ObjectQuery user = te.User.Where("it.User_name like N'1%'") as ObjectQuery;
            Response.Write(user.ToTraceString());
        }

輸出的結果是


SELECT [Extent1].[User_id] AS [User_id]
	, [Extent1].[User_name] AS [User_name]
	, [Extent1].[User_email] AS [User_email]
	, [Extent1].[User_sysdate] AS [User_sysdate] 
FROM [dbo].[User] AS [Extent1] 
WHERE [Extent1].[User_name] LIKE N'1%'

果然可以順利轉換成我要的格式。
所以我們可以利用【Query Builder Mothed】、【Entity SQL Language】來更精確的控制 Provider 轉換後的 SQL 語法。

 

 

額外補充

補充一

我拿上面兩種範例,轉換出來的語法去 SQL 跑跑看,然後看【執行計畫】與【IO使用狀況】,
在三萬多筆資料的情況下,查詢沒有【index】的欄位,執行時間是一樣的,執行計畫各 50 %,
所以我們可以對 EF 幫我們轉換的語法放心

補充二

我這次把執行環境換到 【Visual Studio 2010 Beta 2】,執行一樣的範例,


        using (TestEntities te = new TestEntities())
        {
            ObjectQuery user = te.User.Where(a => a.User_name.StartsWith("1")) as ObjectQuery;
            Response.Write(user.ToTraceString());
        }

結果結果~~~~
2009-10-26_015742 
 讓我對 Visual Studio 2010 更期待了,
找機會在來跟大家分享一下 Visual Studio 2010 beta 2 在 ADO.Net Entity Framework 上的改變 ^-^




 


 

  • 如果您覺得這篇文章有幫助,請您幫忙推薦一下或按上方的""給予支持,非常感激
  • 歡迎轉載,但請註明出處
  • 文章內容多是自己找資料學習到的心得,如有不詳盡或錯誤的地方,請多多指教,謝謝