EF core 性能優化


1.使用 EF.Functions.xxx 進行查詢

(1).使用 EF.Functions.Like進行模糊查詢要比 StartsWith、Contains 和 EndsWith 方法生成的SQL語句性能更優。

A. Contains語句,生成的sql為:

  var data3 = dbContext.T_UserInfor.Where(u => u.userName.Contains("p")).ToList();

用的是charindex

B. EF.Functions.Like語句生成的sql為:(Like搭配SQL查詢的通配符使用)

  var data1 = dbContext.T_UserInfor.Where(u => EF.Functions.Like(u.userName, "%p%")).ToList();
  //或者
  var data2 = (from p in dbContext.T_UserInfor
               where EF.Functions.Like(p.userName, "%p%")
               select p).ToList();

用的是Like

PS:在傳統的.Net中,還有種用法 SqlMethods,詳見:https://www.cnblogs.com/yaopengfei/p/11805980.html

(2).還有EF.Functions.DateDiffDay (DateDiffHour、DateDiffMonth),求天、小時、月之間的數量

PS:在EF Core中StartsWith、Contains和EndsWith模糊查詢實際分別被解析成為Left、CharIndex和Right,而不是Like,而EF.Functions.Like會解析成Like語句。

詳見:https://www.cnblogs.com/tdfblog/p/entity-framework-core-like-query.html

 

2、添加Z.EntityFramework.Plus.EFCore依賴使用一些特殊的語法

      這個是免費的,但 Z.EntityFramework.Plus的一些批量數據操作的包是收費的

(1) EFCore刪除必須先查詢再刪除,優化后可直接刪除:context.User.Where(t => t.Id == 100).Delete();

(2)優化更新語句:context.User.Where(t => t.Id == 4).Update(t =>new User() { NickName = "2224114" ,Phone = "1234"} );

 

3、正確使用Find(id=10)來代替FirstOrDefault(t=>t.id=10)

Find會優先查詢緩存,當前面已經查詢過這條數據的時候使用,而FirstOrDefault每次都會查詢數據庫;當id=10的數據被修改之后,find查出的數據是新數據。

 

4、禁用實體追蹤

當我們從數據庫中查詢出數據時,上下文就會創建實體快照,從而追蹤實體。在調用 SaveChanges 時,實體有任何更改都會保存到數據庫中。

但是當我們只需要查詢出實體而不需要修改時(只讀),實體追蹤就沒有任何用途了。這時我們就可以調用 AsNoTracking 獲取非追蹤的數據,這樣可以提高查詢性能。具體代碼如下:

var users = db.Users.AsNoTracking().ToList();

注:如果是多表查詢可以在查詢前

db.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;

這樣就把所有表查詢設置成了非追蹤狀態

5、判斷查詢出的列表是否有值時,使用 .Any(),盡量不使用 .Count(); .FirstOrDefault()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM