5條EF core性能優(yōu)化技巧,讓你程序健步如飛
1.使用 EF.Functions.xxx 進(jìn)行查詢(xún)
(1).使用 EF.Functions.Like進(jìn)行模糊查詢(xún)要比 StartsWith、Contains 和 EndsWith 方法生成的SQL語(yǔ)句性能更優(yōu)。
A. Contains語(yǔ)句,生成的sql為:
var data3 = dbContext.T_UserInfor.Where(u => u.userName.Contains("p")).ToList();
用的是charindex

B. EF.Functions.Like語(yǔ)句生成的sql為:(Like搭配SQL查詢(xún)的通配符使用)
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í)、月之間的數(shù)量
PS:在EF Core中StartsWith、Contains和EndsWith模糊查詢(xún)實(shí)際分別被解析成為L(zhǎng)eft、CharIndex和Right,而不是Like,而EF.Functions.Like會(huì)解析成Like語(yǔ)句。
2、添加Z.EntityFramework.Plus.EFCore依賴(lài)使用一些特殊的語(yǔ)法
這個(gè)是免費(fèi)的,但 Z.EntityFramework.Plus的一些批量數(shù)據(jù)操作的包是收費(fèi)的
(1) EFCore刪除必須先查詢(xún)?cè)賱h除,優(yōu)化后可直接刪除:context.User.Where(t => t.Id == 100).Delete();
(2)優(yōu)化更新語(yǔ)句:context.User.Where(t => t.Id == 4).Update(t =>new User() { NickName = "2224114" ,Phone = "1234"} );
3、正確使用Find(id=10)來(lái)代替FirstOrDefault(t=>t.id=10)
Find會(huì)優(yōu)先查詢(xún)緩存,當(dāng)前面已經(jīng)查詢(xún)過(guò)這條數(shù)據(jù)的時(shí)候使用,而FirstOrDefault每次都會(huì)查詢(xún)數(shù)據(jù)庫(kù);當(dāng)id=10的數(shù)據(jù)被修改之后,find查出的數(shù)據(jù)是新數(shù)據(jù)。
4、禁用實(shí)體追蹤
當(dāng)我們從數(shù)據(jù)庫(kù)中查詢(xún)出數(shù)據(jù)時(shí),上下文就會(huì)創(chuàng)建實(shí)體快照,從而追蹤實(shí)體。在調(diào)用 SaveChanges 時(shí),實(shí)體有任何更改都會(huì)保存到數(shù)據(jù)庫(kù)中。
但是當(dāng)我們只需要查詢(xún)出實(shí)體而不需要修改時(shí)(只讀),實(shí)體追蹤就沒(méi)有任何用途了。這時(shí)我們就可以調(diào)用 AsNoTracking 獲取非追蹤的數(shù)據(jù),這樣可以提高查詢(xún)性能。具體代碼如下:
var users = db.Users.AsNoTracking().ToList();
注:如果是多表查詢(xún)可以在查詢(xún)前
db.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
這樣就把所有表查詢(xún)?cè)O(shè)置成了非追蹤狀態(tài)
5、使用 .Any(),盡量不使用
判斷查詢(xún)出的列表是否有值時(shí),使用 .Any(),盡量不使用 .Count(); .FirstOrDefault() 出處:
https://www.cnblogs.com/qingheshiguang/p/13559561.html
版權(quán)申明:本文來(lái)源于網(wǎng)友收集或網(wǎng)友提供,僅供學(xué)習(xí)交流之用,如果有侵權(quán),請(qǐng)轉(zhuǎn)告版主或者留言,本公眾號(hào)立即刪除。
