首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

ADO.NET Entity Framework 深度解析(四):四大神器輕鬆查看 EF 生成的 T-SQL

     編輯:關於.NET

Entity Framework 將 LINQ to Entities 與 Entity SQL 轉譯為 T-SQL 執行,但 ObjectContext 不像 LINQ to SQL 的 DataContext.Log 那樣提供內建日誌屬性。掌握以下四種方法,能讓你在開發、除錯、效能調校時「看見」真實執行的 SQL,事半功倍。

方法一:SQL Server Profiler(最全面、生產環境首選)

微軟官方效能分析工具,可擷取資料庫引擎層級的所有 T-SQL 批次、RPC 呼叫、執行計畫、耗時等資訊。

  • 適用:全方位監控、生產環境慢查詢分析、死鎖追蹤。
  • 缺點:需額外安裝/啟動,對資料庫有微小負擔。

教學參考:SQL Profiler: Features, functions and setup in SQL Server 2005

方法二:ToTraceString() 方法(程式碼內快速檢視,無需執行)

EntityCommand、ObjectQuery 均提供 ToTraceString(),可在不開啟連線、不執行查詢的情況下取得即將送往資料庫的 T-SQL 字串。除錯時設中斷點即可檢視。

注意事項

  • 呼叫前必須先開啟連線(context.Connection.Open()),否則拋出 InvalidOperationException。
  • 僅回傳 SQL 文字,不包含參數值(參數以 @p0 等佔位符呈現)。

1. Entity SQL + EntityCommand

using (var conn = new EntityConnection("name=AdventureWorksLTEntities"))
{
    conn.Open(); // 必須先開啟
    var cmd = conn.CreateCommand();
    cmd.CommandText = @"SELECT VALUE c FROM AdventureWorksLTEntities.Category AS c WHERE c.ParentCategory IS NULL";

    Console.WriteLine("【Entity SQL】" + cmd.CommandText);
    Console.WriteLine("【T-SQL】" + cmd.ToTraceString()); // 取得轉譯後的 T-SQL

    using (var rdr = cmd.ExecuteReader(CommandBehavior.SequentialAccess))
    {
        while (rdr.Read()) { /* ... */ }
    }
}

2. Entity SQL + ObjectQuery

var context = new NorthwindEntities();
var sql = "SELECT VALUE emp FROM NorthwindEntities.Employees AS emp WHERE emp.Country = @country";
var query = context.CreateQuery<Employee>(sql);
query.Parameters.Add(new ObjectParameter("country", "USA"));

if (context.Connection.State != ConnectionState.Open)
    context.Connection.Open();

Console.WriteLine(query.ToTraceString());

3. LINQ to Entities + 轉型

LINQ 查詢回傳 IQueryable,需轉型為 ObjectQuery 才能呼叫 ToTraceString():

var context = new NorthwindEntities();
string country = "USA";
var query = from e in context.Employees
            where e.Country == country
            select e;

if (context.Connection.State != ConnectionState.Open)
    context.Connection.Open();

// 方式一:直接轉型
Console.WriteLine((query as ObjectQuery<Employee>).ToTraceString());

// 方式二:反射呼叫(適用於無法直接轉型的情境)
Console.WriteLine(query.GetType().GetMethod("ToTraceString").Invoke(query, null));

Visual Studio 中斷點檢視 ToTraceString 結果

方法三:eSqlBlast 工具(Entity SQL 專用 IDE,支援 IntelliSense)

微軟釋出的免費開源工具,專為撰寫、測試 Entity SQL 設計,支援:

  • 中繼資料檔(CSDL/SSDL/MSL)與連線字串設定。
  • 模型瀏覽:EntitySets、EntityTypes 結構檢視。
  • Entity SQL 編輯器內建 IntelliSense(Visual Studio 2008 SP1 當時尚不支援)。
  • 執行結果四大區塊:Entity Command、Store Command (T-SQL)、Record Count、Data。

下載:eSqlBlast on MSDN Code Gallery(含原始碼,需自行編譯;文末亦提供編譯好版本)。

eSqlBlast Connection 頁面

eSqlBlast Model 頁面

eSqlBlast Query 編輯器與 IntelliSense

eSqlBlast Results 頁面

方法四:LINQPad(輕量級 LINQ 測試神器,支援 LINQ to Entities)

原為 LINQ to Objects/SQL 設計,透過連線字串與組件引用亦可跑 LINQ to Entities。特色:

  • 即時編輯、執行、結果以豐富格式呈現(.Dump() 擴充方法)。
  • 免費、單一執行檔、無需安裝。

下載:LINQPad 官網

LINQPad 執行 LINQ to Entities 查詢

四大工具適用場景速查表

工具優點缺點建議場景
SQL Profiler 最完整、生產環境可用、含執行計畫/耗時 需安裝、權限較高、介面較重 上線前壓測、生產慢查詢分析、死鎖追蹤
ToTraceString() 程式碼內即時檢視、無需外部工具、不執行查詢 需手動開啟連線、無參數值、僅單一查詢 開發除錯、單元測試驗證 SQL 正確性
eSqlBlast Entity SQL 專用、IntelliSense、視覺化模型 需編譯/下載、僅支援 Entity SQL 學習/撰寫複雜 Entity SQL、模型結構探索
LINQPad 極輕量、支援 LINQ to Entities、結果視覺化佳 需手動載入組件/連線字串、非專案整合 快速原型驗證、片段查詢測試、教學示範

善用這四把鑰匙,打開 EF 的黑盒子,讓 SQL 不再神秘,效能調優更有的放矢。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved