LINQ to SQL 為實現高效查詢與更新,內建兩大核心服務:物件身分識別快取 與 變更追蹤。理解這兩項機制有助於撰寫高效能 LINQ 程式碼,並為擴充功能提供參考依據。
同一個 DataContext 內重複查詢相同主鍵資料時,LINQ 會優先從快取返回物件參考,避免重複對應。實測 Northwind Customers 表前 100 筆:
// 第一次查詢:1058 ms(含資料庫連線、對應)
// 第二次查詢:3 ms(直接從快取取得物件參考)
關鍵點:
IsPrimaryKey=true 的 ColumnDataContext 內相同主鍵查詢返回同一物件實例(customerA == customerB // true)SubmitChanges 時發生樂觀並發衝突查詢返回物件前,DataContext 保存一份物件複本(原始值)。屬性修改時透過追蹤機制記錄變更,SubmitChanges 產生精準 SQL:
UPDATE [Products] SET [ProductName] = @p9
WHERE ([ProductID] = @p0) AND ([ProductName] = @p1) ... -- 僅更新異動欄位,WHERE 條件含原始值實現並發檢測
運作原理:
PropertyChanging/Changed 事件記錄異動查詢顯示為主的場景可關閉兩項服務提升效能:
context.ObjectTrackingEnabled = false; // 關閉身分識別快取與變更追蹤
context.DeferredLoadingEnabled = false; // 關閉延遲載入
注意:ObjectTrackingEnabled=false 時自動禁用延遲載入。實際專案效能差異視資料量與查詢複雜度而定,建議實測比對。