本篇介紹三項基礎但關鍵的 EF 效能優化手段:MergeOption.NoTracking、GetObjectByKey 與 First 的差異。
預設 EF 會將查詢結果實體放入 ObjectStateManager 追蹤變更。若僅需讀取資料(報表、列表頁),設定 MergeOption.NoTracking 可略過追蹤機制,不載入導航屬性,大幅降低記憶體佔用與查詢延遲。
[Test]
public void NoTrackingTest() {
using (var db = new NorthwindEntities1()) {
db.Customers.MergeOption = MergeOption.NoTracking;
var cust = db.Customers.Where(c => c.City == "London");
foreach (var c in cust)
Console.WriteLine(c.CustomerID);
// 替代寫法
// var cust1 = ((ObjectQuery<Customers>)cust).Execute(MergeOption.NoTracking);
// ESQL 寫法
// string esql = "select value c from customers as c where c.CustomerID='ALFKI'";
// db.CreateQuery<Customers>(esql).Execute(MergeOption.NoTracking).FirstOrDefault();
}
}
善用 GetObjectByKey 可減少重複主鍵查詢的資料庫往返。