這邊分享一下,提升ADO.Net Entity Framework執行速度的幾個方法
這邊分享一下,提升ADO.Net Entity Framework執行速度的幾個方法,
技巧一 取得單一資料時,可利用【GetObjectByKey】
在預設中,ObjectContext 在查詢資料的時候,並不會以快取物件作為優先查詢,
會在每次查詢時都向資料庫要資料,對效能會產生一定的影響,
因此可以利用【GetObjectByKey】方法來對快取物件進行查詢,
但如果使用【GetObejctByKey】方法進行查詢,而快取物件又不存在時,
會發生 ObjectNotFoundException 例外,
要避免此問題可利用【TryGetObejctByKey】方法,
如果在快取物件中找不到資料時,會回傳 false,
////示範一 TryGetObjectByKey
using (TestEntities te = new TestEntities())
{
object entity;
EntityKey key = new EntityKey("TestEntities.User", "User_id", 1);
te.TryGetObjectByKey(key, out entity);
////使用 entity 物件
////....
}
技巧二 重複執行相同查詢語法,可利用已編譯查詢【CompiledQuery】
在我們每次下達 Linq to Entities 向資料庫查詢資料時,
會先編譯成 Entity SQL Language ,再經由 Provider 轉換成對應該資料庫的語法,
如果我們在迴圈裡,對同一個查詢下達1000次的話,就要經過1000次的轉換,
這是很浪費效能的,
因此 ADO.Net Entity Framework 提供了 CompiledQuery 類別,
可以進行查詢的編譯和快取以供重複使用,
這邊簡單看一個範例
/// <summary>
/// 已編譯查詢
/// </summary>
private static readonly Func<TestEntities, int ,User> CompiledQueryGetUserById =
CompiledQuery.Compile<TestEntities, int, User>((te, id) => te.User.Where(a=>a.User_id == id).FirstOrDefault());
////示範二 CompiledQuery
using (TestEntities te = new TestEntities())
{
//// 利用 CompiledQuery 取得資料
User u = CompiledQueryGetUserById.Invoke(te, 1);
}
技巧三 只進行查詢,而不異動資料時 可利用【MergeOption.NoTracking】
使用【MergeOption.NoTracking】時,
因為不會再 ObjectStateManager 中追蹤物件異動狀態,
因此查詢時效能較好,(系統預設是使用【MergeOption.AppendOnly】)
範例
////示範三 MergeOption.NoTracking
using (TestEntities te = new TestEntities())
{
User u = te.User.Execute(MergeOption.NoTracking).Where(a => a.User_id == 1).FirstOrDefault();
}
參考連結
CompiledQuery 類別
已編譯的查詢 (LINQ to Entities)
MergeOption 列舉型別
ObjectStateManager
ObjectContext..::.TryGetObjectByKey 方法
- 如果您覺得這篇文章有幫助,請您幫忙推薦一下或按上方的"讚"給予支持,非常感激
- 歡迎轉載,但請註明出處
- 文章內容多是自己找資料學習到的心得,如有不詳盡或錯誤的地方,請多多指教,謝謝