ADO.NET 團隊揭露 EF(Beta 3)效能特徵:抽象層轉換必然帶來開銷,但透過預生成 View、查詢快取、編譯 LINQ、NoTracking 等策略可大幅降低延遲。本文以 Northwind 資料庫實測,量化各階段耗時比例並給出優化清單。
using (var ne = new NorthwindEntities())
{
foreach (var o in ne.Orders) { int i = o.OrderID; }
}
| 階段 | 佔比 | 說明 |
|---|---|---|
| 載入中繼資料 | 11% | 讀取 EDMX/CSDL/SSDL/MSL |
| 初始化中繼資料 | 14% | 建立 MetadataWorkspace |
| 開啟連線 | 8% | 資料庫連線建立 |
| 生成 View | 56% | 將對應關係編譯為 Entity SQL 片段,最大頭 |
| 載入組件 | 2% | |
| 追蹤初始化 | 1% | ObjectStateManager 準備 |
| 實例化實體 | 7% | 物質化 |
| 其他 | 1% |
Func<NorthwindEntities, IQueryable<Order>> compiled =
CompiledQuery.Compile((NorthwindEntities ne) => from o in ne.Orders select o);
using (var ne = new NorthwindEntities())
{
foreach (var o in compiled(ne)) { int i = o.OrderID; }
}
ObjectContext 首次建立含中繼資料載入/驗證成本 → 考慮單例或預熱;MergeOption.NoTracking。