如何使用【Query Builder Mothed】、【Entity SQL Language】來更精確的控制 Provider 轉換後的 SQL 語法
上篇介紹了EF的三種查詢方式,
- Linq to Entities
- Query Builder Mothed
- 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());
}
結果結果~~~~
讓我對 Visual Studio 2010 更期待了,
找機會在來跟大家分享一下 Visual Studio 2010 beta 2 在 ADO.Net Entity Framework 上的改變 ^-^
- 如果您覺得這篇文章有幫助,請您幫忙推薦一下或按上方的"讚"給予支持,非常感激
- 歡迎轉載,但請註明出處
- 文章內容多是自己找資料學習到的心得,如有不詳盡或錯誤的地方,請多多指教,謝謝