1. 使用EF.Functions.xxx進行查詢
1.1使用 ef.functions.like 進行模糊查詢要比 startswith、contains 和 endswith 方法生成的 sql 語句性能更優。
- contains 語句,生成的 sql 為:
var data3 = dbContext.T_UserInfor.Where(u => u.userName.Contains("p")).ToList();
用的是 charindex

- 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 的一些批量數據操作的包是收費的
- efcore 刪除必須先查詢再刪除,優化後可直接刪除:
context.User.Where(t => t.Id == 100).Delete();
- 優化更新語句:
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;
這樣就把所有表查詢設置成了非追蹤狀態