幾條EF Core效能最佳化,讓你的程式健步如飛

幾條EF Core效能最佳化,讓你的程式健步如飛

數條建議

最後更新 2022/5/4 下午3:41
清和时光
預計閱讀 3 分鐘
分類
EF Core
標籤
.NET C# EF Core 效能最佳化 ORM

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

1.1 使用 EF.Functions.Like 進行模糊查詢要比 StartsWith、Contains 和 EndsWith 方法生成的 SQL 語句效能更佳。

  1. Contains 語句,生成的 sql 為:
var data3 = dbContext.T_UserInfor.Where(u => u.userName.Contains("p")).ToList();

用的是 charindex

  1. 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

1.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();
  1. 優化更新語句:
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()

繼續探索

延伸閱讀

更多文章