EntityFramework Core 2.0 Explicitly Compiled Query(显式编译查询)

前言

EntityFramework Core 2.0引入了显式编译查询,在查询数据时预先编译好LINQ查询便于在请求数据时能够立即响应。显式编译查询提供了高可用场景,通过使用显式编译的查询可以提高查询性能。EF Core已经使用查询表达式的散列来表示自动编译和缓存查询,当我们的代码需要重用以前执行的查询时,EF Core将使用哈希查找并从缓存中返回已编译的查询。我们更希望直接使用编译查询绕过散列计算和高速缓存查找。

EntityFramework Core 2.0显式编译查询

比如我们要从博客实体中通过主键查询博客同时饥饿加载发表文章的集合列表,如下:

            var id = 1;using (var context = new EFCoreDbContext()){var blog = context.Blogs.AsNoTracking().Include(c => c.Posts).Where(c => c.Id == id).FirstOrDefault();}

当进行上述查询时,此时要经过编译翻译阶段最终返回实际结果,比如在Web网站上这样的请求很频繁,此时将严重影响响应速度导致页面加载数据过慢。从Web程序应用角度来看我们大可利用ASP.NET Core中的响应式缓存,在实际应用中我们会将查询封装为方法来使用,我们无法优化结果和查询方式,但是我们能够通过编译查询来提前保存好数据以达到缓存的效果。通过EF静态类中的扩展方法CompileQuery来实现。如下:

        static async Task<Blog> GetBlogAsync(EFCoreDbContext context, int id){Func<EFCoreDbContext, int, Task<Blog>> blog = EF.CompileAsyncQuery((EFCoreDbContext context, int Id) =>context.Blogs.Include(c => c.Posts).Where(c => c.Id == Id).FirstOrDefault());return await blog(context, id);}

常规查询和显式编译查询性能比较

接下来我们测试常规查询和使用显式编译查询的性能,我们利用EF Core提供的内存数据库来测试避免使用SQL Server数据库,利用SQL Server数据库很难去比较二者性能问题,因为数据库会进行查询计划优化和缓存,利用内存数据库只知道当前执行的查询不会进行任何优化, 首先我们下载EF Core内存数据库。额外再说明一点内存数据库在进行单元测试时很有意义。

接下来我们首先测试常规查询,我们预先在内存数据库中创建50条记录,然后查询十万次数据,这样来看每一次查询都会再次重新编译。

        public static void Main(string[] args){var options = new DbContextOptionsBuilder<EFCoreDbContext>().UseInMemoryDatabase(Guid.NewGuid().ToString()).Options;var context = new EFCoreDbContext(options);var stopWatch = new Stopwatch();FillBlogs(context);stopWatch.Start();for (var i = 0; i < 1000000; i++){GetUnCompileQueryBlog(context);}stopWatch.Stop();Console.Write("Compiling time:");Console.WriteLine(stopWatch.Elapsed);Console.ReadKey();}static void FillBlogs(EFCoreDbContext context){for (var i = 0; i < 50; i++){context.Blogs.Add(new Blog{Name = "Jeffcky",CreatedTime = DateTime.Now,Url = "http://www.cnblogs/com/CreateMyself",ModifiedTime = DateTime.Now,Posts = new List<Post>(){new Post(){CommentCount = i, CreatedTime = DateTime.Now,ModifiedTime = DateTime.Now, Name = "EF Core"}}});}context.SaveChanges(true);}static Blog GetUnCompileQueryBlog(EFCoreDbContext context){return context.Blogs.Include(c => c.Posts).OrderBy(o => o.Id).FirstOrDefault();}

我们看到上述利用常规查询总耗时27秒,接下来我们再来看看显式编译查询耗时情况。

private static Func<EFCoreDbContext, Blog> _getCompiledBlog = EF.CompileQuery((EFCoreDbContext context) =>context.Blogs.Include(c => c.Posts).OrderBy(o => o.Id).FirstOrDefault());
            var options = new DbContextOptionsBuilder<EFCoreDbContext>().UseInMemoryDatabase(Guid.NewGuid().ToString()).Options;var context = new EFCoreDbContext(options);var stopWatch = new Stopwatch();FillBlogs(context);stopWatch.Start();for (var i = 0; i < 100000; i++){GetCompileQueryBlog(context);}stopWatch.Stop();Console.Write("Compiling time:");Console.WriteLine(stopWatch.Elapsed);Console.ReadKey();

如上通过显式编译查询耗时16秒,那么是不是就说明显式编译查询性能一定优于常规查询呢?显然不是这样,上述只是简单的测试方法,有可能运行多次显式编译查询性能还低于常规查询,所以上述简单的测试方法并不能看出常规查询和显式编译查询之间的性能差异,当查询基数足够大时则能通过机器明显看出二者之间的性能差异,这也就说明了为什么EntityFramework Core官方文档说明显式编译查询的高可用。但是显式编译查询还有且缺点,当我们进行如下查询呢?

        public static void Main(string[] args){var options = new DbContextOptionsBuilder<EFCoreDbContext>().UseInMemoryDatabase(Guid.NewGuid().ToString()).Options;var context = new EFCoreDbContext(options);var blogs = GetCompileQueryBlogs(context);Console.ReadKey();}static Blog[] GetCompileQueryBlogs(EFCoreDbContext context){Func<EFCoreDbContext, Blog[]> func = EF.CompileQuery((EFCoreDbContext db) =>db.Blogs.Include(c => c.Posts).OrderBy(o => o.Id).ToArray());return func(context);}}

当前EntityFramework Core 2.0.1版本对于显式编译查询还不支持返回IEnumerable<T>, IQueryable<T>的集合类型,期待未来能够有所支持。

总结缺陷

显式编译查询提供高可用场景,但是仍然存在其缺陷,期待未来能有更多支持,希望给阅读的您一点帮助。精简的内容,简单的讲解,希望对阅读的您有所帮助,我们明天再会。

转载于:https://www.cnblogs.com/CreateMyself/p/8519512.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/539212.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle Minus关键字 不包含 取差集

Oracle Minus关键字   SQL中的MINUS关键字   SQL中有一个MINUS关键字&#xff0c;它运用在两个SQL语句上&#xff0c;它先找出第一条SQL语句所产生的结果&#xff0c;然后看这些结果有没有在第二个SQL语句的结果 中。如果有的话&#xff0c;那这一笔记录就被去除&#xff0…

python扫描器甄别操作系统类型_20189317 《网络攻防技术》 第三周作业

一.教材内容总结1.网络踩点&#xff1a;web搜索与挖掘、DNS和IP查询、网络拓扑侦察(1)网络踩点目标确定(2)技术手段&#xff1a;web信息搜索与挖掘、DNS和IP查询、网络拓扑侦察(3)web信息搜索与挖掘&#xff1a;基本搜索与挖掘技巧、高级搜索与挖掘技巧、编程实现google搜索、元…

python 网页重定向_小试牛刀:python爬虫爬取springer开放电子书.

首先声明,本文旨在记录反思,并没有资源,代码也不具有借鉴意义(水平实在不行.某天,水群的时候发现群友发了一个文件,里面是疫情时期springer开放的免费电子书名单,同时还附有下载链接,总共有400多本,这要是一个一个下载不得累死个人,只下载自己感兴趣的书也是一个好主意,但是,我…

直面桌面云带来的现状优势

在桌面云解决方案里&#xff0c;首先&#xff0c;所有的数据以及运算都在服务器端进行&#xff0c;客户端只是显示其变化的影像而已&#xff0c;所以在不需要担心客户端来非法窃取资料&#xff0c;我们在电影里面看到的商业间谍拿着 U 盘疯狂的拷贝公司商业机密的情况再也不会出…

ORA-28001: the password has expired解决方法

Oracle提示错误消息ORA-28001: the password has expired&#xff0c;是由于Oracle11G的新特性所致&#xff0c; Oracle11G创建用户时缺省密码过期限制是180天&#xff08;即6个月&#xff09;&#xff0c; 如果超过180天用户密码未做修改则该用户无法登录。 Oracle公司是为了数…

.net 导出excel_Qt编写的项目作品18-数据导出到Excel及Pdf和打印数据

一、功能特点原创导出数据机制&#xff0c;不依赖任何office组件或者操作系统等第三方库&#xff0c;尤其是支持嵌入式linux。10万行数据9个字段只需要2秒钟完成。只需要四个步骤即可开始急速导出大量数据到Excel。同时提供直接写入数据接口和多线程写入数据接口&#xff0c;不…

hive数据库定义

默认数据库"default" 可以显式切换数据库&#xff1a;hive> use 数据库名; 创建 hive>CREATE DATABASE [IF NOT EXISTS] mydb [LOCATION] /....... [COMMENT] ....; 实例 hive (default)> create database test_db comment test database; OK Ti…

图像增强_Keras 常用的图像增强方式

欢迎关注 “小白玩转Python”&#xff0c;发现更多 “有趣”在使用神经网络和深度学习模型时&#xff0c;需要进行数据准备。对于更复杂的物体识别任务&#xff0c;也越来越需要增加数据量。数据增加意味着增加数据量。换句话说&#xff0c;拥有更大的数据集意味着更健壮的模型…

Facebook产品经理的三年叙事与协作思考

产品经理和研发工程师的关系经常被大家调侃&#xff0c;可偏偏就有同时受到研发和设计都喜欢的“别人家的产品经理”&#xff0c;沟通协调、对接需求、项目把控面面俱到还有好人缘。有没有人天生就是产品经理&#xff1f;产品经理的工作就是写需求写需求和写需求么&#xff1f;…

sis新地址_坚若磐石不掉速,老平台升级新选择,入手昱联Asint 500G SSD

我是文章的原作者&#xff0c;文章首发于&#xff1a;什么值得买爱折腾的老狐狸​zhiyou.smzdm.com首发文章链接&#xff1a;坚若磐石不掉速&#xff0c;老平台升级新选择&#xff0c;入手昱联Asint 500G SSD _值客原创_什么值得买​post.smzdm.com虽然说&#xff0c;现在越来越…

hive表定义(3种方式)

创建表 方式一 建表语法 CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_name data_type [COMMENT col_comment], ...)] [COMMENT table_comment] [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)] [CLUSTERED BY (col_name, col_name, ..…

进度条设置_为你的练习设置进度条

在我们的日常练习中&#xff0c;遇到最多的一个问题就是不知道自己练得怎么样了&#xff1f;还需不需要继续&#xff0c;或者调整练习方法。这种问题大多出现在自学吉他的学生当中&#xff0c;因为得不到老师的反馈&#xff0c;自己练得对不对&#xff0c;够不够&#xff0c;都…

Python之路(第二篇):Python基本数据类型字符串(一)

一、基础1、编码 UTF-8:中文占3个字节 GBK&#xff1a;中文占2个字节 Unicode、UTF-8、GBK三者关系 ascii码是只能表示英文字符&#xff0c;用8个字节表示英文&#xff0c;unicode是统一码&#xff0c;世界通用码&#xff0c;规定采用2个字节对世界各地不同文字进行编码&#x…

python ftp下载文件_文件上传下载Python

点击上方蓝字关注我&#xff01;图片来源 pexels.com简单实现文件上传、下载1 Server端 # -*- coding: utf-8 -*-import jsonimport os__author__ sange# Time : 2020/8/17 下午5:26# Author : sange# File : tcpserver_socket.py# Software: PyCharmimport socketserv…

hive列定义

修改 列的名称、类型、位置、注释 hive>ALTER TABLE t3 CHANGE COLUMN old_name new_name String [COMMENT ...] [AFTER column2]; 实例 hive (zmgdb)> alter table t1 change column car sarly int after office; FAILED: Execution Error, return code 1 from org.a…

react json转换_Typescript + React 新手篇

极链科技前端工程师茅丹丹前言 TS是什么Type Type (标准JS)。TS的官方网站&#xff1a;Type is a typed superset of Java that compiles to plain Java。Type是一个编译到纯JS的有类型定义的JS超集。 TS优点 TS 最大的优势是它提供了强大的静态分析能力&#xff0c;结合 TSL…

android listview 滑动条显示_第七十六回:Android中UI控件之RecyclerView基础

各位看官们&#xff0c;大家好&#xff0c;上一回中咱们说的是Android中UI控件之ListView优化的例子&#xff0c;这一回咱们说的例子是UI控件之RecyclerView。闲话休提&#xff0c;言归正转。让我们一起Talk Android吧&#xff01;看官们&#xff0c;我们在前面章回中介绍了Lis…

数据建模大数据就业挑战月薪30K

点击关注 异步图书&#xff0c;置顶公众号每天与你分享 IT好书 技术干货 职场知识本文大概 10624 字读完共需 30 分钟Tips 参与文末话题讨论&#xff0c;即有机会获得异步图书一本。数据建模是对现实世界各类数据进行抽象组织、界定数据库需管辖的范围、确定数据的组织形式等直…

Hive的数据模型-管理表

概述 管理表&#xff0c;也称作内部表,受控表。 所有的 Table 数据&#xff08;不包括 External Table&#xff09;都保存在warehouse这个目录中。 删除表时&#xff0c;元数据与数据都会被删除。 在加载数据的过程中&#xff0c;实际数据会被移动到数据仓库目录中&#xff1b…

mft按钮设计_火力发电厂典型MFT逻辑控制实现.pdf

火力发电厂典型MFT逻辑控制实现.pdf火力发电厂典型MFT逻辑控制实现刘文丰 陈思铭湖南省电力试验研究院 (湖南长沙410007)摘要&#xff1a;以金竹山电厂扩建工程国产2600MW亚临界机组为例&#xff0c;概述了必力发电厂FSSS中典型MFT的原理及重要性&#xff0c;详细介绍各MFT条件…