#yyds干货盘点#愚公系列2023年02月 .NET/C#知识点-EF Core性能优化之显示编译
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了#yyds干货盘点#愚公系列2023年02月 .NET/C#知识点-EF Core性能优化之显示编译相关的知识,希望对你有一定的参考价值。
前言
性能优化,简而言之,就是在不影响系统运行正确性的前提下,使之运行地更快,完成特定功能所需的时间更短。
对于EF Core的查询优化其实也是多种多样的,性能优化是在特定的情况下的特定解决方案,下面着重介绍EF Core的显示编译查询
1.显示编译的概念
EF Core对我们查询的表达式的编译使用了缓存,当你查询代码需要重用以前执行的查询时,EF Core将使用哈希查找并从缓存中返回已编译的查询。如果能直接对查询进行编译,并跳过哈希的计算和缓存查找那么效率是否会提高呢?这就是显示编译。
说白了也就是跳过查找的过程,而且使用场景如下:
- EF Core,还不支持编译查询返回集合类型。
- 在数据量大的时候使用,比如查询大于一百万次时候大约回快6倍,一万次大约是2倍左右。
一、Core性能优化之显示编译
本文主要是内存数据库的方式来测试显示编译查询的性能,避免了其他因素。
显示编译的两个方法如下:
EF.CompileQuery()//同步方法
EF.CompileAsyncQuery()异步方法
这两个方法允许您定义一个已编译的查询,然后通过调用一个委托调用它。
1.安装
install-package Microsoft.EntityFrameworkCore.InMemory
2.注入
services.AddDbContext<TestDbContext>(options =>
options.UseInMemoryDatabase(new Guid().ToString());
);//Guid是内存表名称
3.创建数据库上下文类
public class Team
public int Id set; get;
public string Name set; get;
public int ageset; get;
//建立上下文,并加入Team表
public class TestDbContext : DbContext
public TestDbContext(DbContextOptions<TestDbContext> options) : base(options)
public DbSet<Team> Teams get; set;
public void FillCategories()//插入内存数据库里
var Team = new List<Team>();
for (int i = 0; i < 100000; i++)
Teams.Add(new Team Id = i, Name = "张山", age = i + 1 );
Teams.AddRange(Team);
SaveChanges(true);
4.创建查询控制器类
[ApiController]
[Route("[controller]/[action]")]
public class TeamsCompileQueryController : ControllerBase
public TestDbContext teamContext;
public TeamsCompileQueryController(TestDbContext teamContext)
this.teamContext = teamContext;
[HttpGet(Name = "CompiledQuery")]
public void CompiledQuery()
Func<TestDbContext, Team> compileQuery = EF.CompileQuery((TestDbContext context) =>
context.Teams.OrderBy(o => o.Id).FirstOrDefault())!;
var stopWatch = new Stopwatch();
teamContext.Database.EnsureDeleted();
teamContext.Database.EnsureCreated();
stopWatch.Restart();
for (var i = 0; i < 100; i++)
var blog = compileQuery(teamContext);
stopWatch.Stop();
Console.WriteLine("显示编译查询:" + stopWatch.Elapsed);
[HttpGet(Name = "UnCompiledQuery")]
public void UnCompiledQuery()
Func<TestDbContext, Team> unCompileQuery = context =>
return context.Teams.OrderBy(o => o.Id).FirstOrDefault()!;
;
var stopWatch = new Stopwatch();
teamContext.Database.EnsureDeleted();
teamContext.Database.EnsureCreated();
stopWatch.Start();
for (var i = 0; i < 100; i++)
var blog = unCompileQuery(teamContext);
stopWatch.Stop();
Console.WriteLine("常规查询:" + stopWatch.Elapsed);
类中有两个方法,一个是普通查询,一个是显式编译查询。
5.运行
5.1 常规查询
5.2 显示编译查询
以上是关于#yyds干货盘点#愚公系列2023年02月 .NET/C#知识点-EF Core性能优化之显示编译的主要内容,如果未能解决你的问题,请参考以下文章
#yyds干货盘点#愚公系列2023年02月 .NET/C#知识点-程序运行计时的总结
#yyds干货盘点#愚公系列2023年02月 微信小程序-电商项目-商品详情页面的标题及价格功能实现
#yyds干货盘点#愚公系列2023年02月 .NET/C#知识点-区块链概念和实现
#yyds干货盘点#愚公系列2023年02月 .NET/C#知识点-List转成字符串的总结