ADO.Net Entity Framework : (二十) 提升EF執行速度方法

這邊分享一下,提升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 方法




 


 

  • 如果您覺得這篇文章有幫助,請您幫忙推薦一下或按上方的""給予支持,非常感激
  • 歡迎轉載,但請註明出處
  • 文章內容多是自己找資料學習到的心得,如有不詳盡或錯誤的地方,請多多指教,謝謝