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;
這樣就把所有表查詢設置成了非追蹤狀態