本篇介紹三項提升 Entity Framework 效能的關鍵技巧:編譯查詢、存儲模型視圖與並發衝突處理。
當相同查詢需重複執行多次(如迴圈、高頻 API),使用 CompiledQuery.Compile 將 LINQ 查詢編譯為委派,避免重複解析表達式樹,顯著降低 CPU 開銷。
[Test]
public void CompileTest() {
using (var db = new NorthwindEntities1()) {
// 編譯查詢:取得倫敦地區客戶
var customer = CompiledQuery.Compile<NorthwindEntities1, IQueryable<Customers>>(
db => db.Customers.Where(c => c.City == "London"));
// 連續執行 20 次並計時
for (int i = 0; i < 20; i++) {
DateTime dt = DateTime.Now;
foreach (var c in customer(db))
Console.WriteLine(c.CustomerID);
Console.WriteLine(DateTime.Now.Subtract(dt).TotalMilliseconds);
Console.WriteLine("---------------------------------------------------");
}
}
}
首次呼叫會編譯並快取,後續呼叫直接重用編譯後的委派,效能提升明顯。
透過定義對應資料庫 View 的實體型別,將複雜聯結、聚合邏輯下推至資料庫層,減少資料傳輸量與客戶端運算。
EF 支援樂觀並發控制,透過 ConcurrencyMode 屬性與 OptimisticConcurrencyException 捕捉衝突,結合 RefreshMode 實現「保留本地變更」或「覆寫為資料庫值」等策略,確保資料一致性。