5個EF core性能優(yōu)化技巧,讓你程序健步如飛
1.使用 EF.Functions.xxx 進行查詢
(1).使用 EF.Functions.Like進行模糊查詢要比 StartsWith、Contains 和 EndsWith 方法生成的SQL語句性能更優(yōu)。
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();
注:需要引用Microsoft.EntityFrameworkCore命名空間 用的是Like

PS:在傳統(tǒng)的.Net中,還有種用法 SqlMethods
(2).還有EF.Functions.DateDiffDay (DateDiffHour、DateDiffMonth),求天、小時、月之間的數(shù)量
PS:在EF Core中StartsWith、Contains和EndsWith模糊查詢實際分別被解析成為Left、CharIndex和Right,而不是Like,而EF.Functions.Like會解析成Like語句。
2、添加Z.EntityFramework.Plus.EFCore依賴使用一些特殊的語法
這個是免費的,但 Z.EntityFramework.Plus的一些批量數(shù)據(jù)操作的包是收費的
(1) EFCore刪除必須先查詢再刪除,優(yōu)化后可直接刪除:context.User.Where(t => t.Id == 100).Delete();
(2)優(yōu)化更新語句: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會優(yōu)先查詢緩存,當前面已經(jīng)查詢過這條數(shù)據(jù)的時候使用,而FirstOrDefault每次都會查詢數(shù)據(jù)庫;當id=10的數(shù)據(jù)被修改之后,find查出的數(shù)據(jù)是新數(shù)據(jù)。
4、禁用實體追蹤
當我們從數(shù)據(jù)庫中查詢出數(shù)據(jù)時,上下文就會創(chuàng)建實體快照,從而追蹤實體。在調(diào)用 SaveChanges 時,實體有任何更改都會保存到數(shù)據(jù)庫中。
但是當我們只需要查詢出實體而不需要修改時(只讀),實體追蹤就沒有任何用途了。這時我們就可以調(diào)用 AsNoTracking 獲取非追蹤的數(shù)據(jù),這樣可以提高查詢性能。具體代碼如下:
var users = db.Users.AsNoTracking().ToList();
注:如果是多表查詢可以在查詢前
db.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
這樣就把所有表查詢設置成了非追蹤狀態(tài)
5、使用 .Any(),盡量不使用
判斷查詢出的列表是否有值時,使用 .Any(),盡量不使用 .Count(); .FirstOrDefault() 出處:
https://www.cnblogs.com/qingheshiguang/p/13559561.html
版權(quán)申明:本文來源于網(wǎng)友收集或網(wǎng)友提供,僅供學習交流之用,如果有侵權(quán),請轉(zhuǎn)告版主或者留言,本公眾號立即刪除。
