首页 > 编程语言 >5条EF core性能优化技巧,让你程序健步如飞

5条EF core性能优化技巧,让你程序健步如飞

时间:2022-10-09 09:12:09浏览次数:80  
标签:core Functions Like EF 健步如飞 查询 var Where

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();

注:需要引用Microsoft.EntityFrameworkCore命名空间 用的是Like

 

 

PS:在传统的.Net中,还有种用法 SqlMethods

(2).还有EF.Functions.DateDiffDay (DateDiffHour、DateDiffMonth),求天、小时、月之间的数量

PS:在EF Core中StartsWith、Contains和EndsWith模糊查询实际分别被解析成为Left、CharIndex和Right,而不是Like,而EF.Functions.Like会解析成Like语句。

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;
这样就把所有表查询设置成了非追踪状态
 

5、使用 .Any(),尽量不使用

判断查询出的列表是否有值时,使用 .Any(),尽量不使用 .Count(); .FirstOrDefault() 

标签:core,Functions,Like,EF,健步如飞,查询,var,Where
From: https://www.cnblogs.com/fei686868/p/16770942.html

相关文章

  • ASP.NET Core实现内容协商 (json+xml)(如何根据请求的媒体类型调整数据的输出)
    内容协商概念内容协商ContentNegotiation:允许客户端和服务器通过协商来决定相互之间数据的传输格式、语言等。HTTP头部http头部的媒体类型MediaTypes定义accept和......
  • CSharp: Strategy Pattern in donet core 3
     ///<summary>///车辆行为模型///AbstractBehavior///策略模式StrategyPattern///geovindu,GeovinDuedit//////</summa......
  • StatefulSet控制器
    应用程序存在“有状态”和“无状态”两种类别。无状态服务(StatelessService):该服务运行的实例不会在本地存储需要持久化的数据,并且多个实例对于同一个请求响应的......
  • VScode开发STM32/GD32单片机-MakeFile工程JlinkRTT配置
    本次使用开发板为STM32F401CCU6,使用CubeMX配置一个Makefile工程  配置时候为内部时钟  工程选择makefile工程类型 只生成需要的文件  用VSCode打开后显......
  • Codeforces Round #822 (Div. 2)
    A题意给一个长为n的数组,每次可以对其中某个数做+1或-1的操作。求最小的操作次数,使得可以从数组中选出三个相同的数。思路很容易可以想到选三个最接近的数然后操作。也......
  • CSharp: Observer Pattern in donet core 3
     ///<summary>///观察者模式ObserverPattern亦称:事件订阅者、监听者、Event-Subscriber、Listener、Observe///geovindu,GeovinDueidt///......
  • 使用EF Core更新与修改生产数据库
    使用EFCore的CodeFirst,在设计阶段,直接使用Database.EnsureCreated()和EnsureDeleted()可以快速删除、更新最新的数据结构。由于没有什么数据,删除的风险非常低。但是对于......
  • .NET Core和.NET Framework中DateTime.Now的区别
    今天和医院的微信公众号接口对接,需要传当前时间,我随手写了一个DateTime.Now传了过去,过了一会那边说时间格式不对,原来.NETCore中DateTime.Now的格式是2022/10/08下午04......
  • PriceFixed
    传送门题意:市场上有\(a[i]\)种商品,每种商品的价格都是\(2\)。现在你需要买这种商品\(a[i]\)件。但是对于第\(i\)种商品有一个属性\(bi\),意味着如果你已经买了\(bi......
  • 【Java基础】时间日期类之Date类、SimplDateFormat类、Calendar类及二月天案例
    目录​​一、Date类​​​​二、SimpleDateFormat类​​​​三、Calendar类​​​​四、二月天案例​​一、Date类Date代表一个特定的时间,精确到毫秒Date构造方法:方法名说明......