Entity Framework 將 LINQ to Entities 與 Entity SQL 轉譯為 T-SQL 執行,但 ObjectContext 不像 LINQ to SQL 的 DataContext.Log 那樣提供內建日誌屬性。掌握以下四種方法,能讓你在開發、除錯、效能調校時「看見」真實執行的 SQL,事半功倍。
微軟官方效能分析工具,可擷取資料庫引擎層級的所有 T-SQL 批次、RPC 呼叫、執行計畫、耗時等資訊。
教學參考:SQL Profiler: Features, functions and setup in SQL Server 2005
EntityCommand、ObjectQuery 均提供 ToTraceString(),可在不開啟連線、不執行查詢的情況下取得即將送往資料庫的 T-SQL 字串。除錯時設中斷點即可檢視。
context.Connection.Open()),否則拋出 InvalidOperationException。@p0 等佔位符呈現)。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()) { /* ... */ }
}
}
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());
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));

微軟釋出的免費開源工具,專為撰寫、測試 Entity SQL 設計,支援:
下載:eSqlBlast on MSDN Code Gallery(含原始碼,需自行編譯;文末亦提供編譯好版本)。




原為 LINQ to Objects/SQL 設計,透過連線字串與組件引用亦可跑 LINQ to Entities。特色:
.Dump() 擴充方法)。下載:LINQPad 官網

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