EF Core 相关的千倍性能之差: AutoMapper ProjectTo VS Mapster ProjectToType

在前两天遇到 .NET Core 中 EF Core 的异步与同步查询的百倍性能之差(详情之前的博文)之后,这两天又遇到了 AutoMapper ProjectTo<T>Mapster ProjectToType<T> 的千倍性能之差。

问题是在昨天发现的,使用 AutoMapper ProjectTo<T> + EF Core 从数据库中获取20条记录竟然耗时 10s 左右。

[Information] Executed DbCommand ("9,947"ms) [Parameters=["@__p_3='20'"], CommandType='Text', CommandTimeout='30']"

如果改为获取10条记录,耗时需要 5s 左右,从中可以推测某个原因造成获取单条记录增加了额外的开销。

而用同样的 SQL 语句在 SSMS 中查询数据库飞快,可以排除不是数据库层面的问题。

根据前车之鉴,将异步的 ToListAsync() 改为同步的 ToList() ,但问题依旧。

对于这个奇怪的问题,从 EF Core 层面实在找不到线索,于是将怀疑的目光转向了 AutoMapper

代码中用到了 AutoMapper 的 ProjectTo

return await _postQueryRepository
    .GetPostsByStartId(startId)
    .OrderBy(p => p.Id)
    .Take(itemCount)
    .ProjectTo<T>()
    .ToListAsync();

在配置映射时使用了字符串连接:

conf.CreateMap<BlogPost, BlogPostDto>()
    .ForMember(dto => dto.AuthorUrl, opt => opt.MapFrom(p => "https://www.cnblogs.com/" + p.BlogSite.Application + "/"));

去掉上面的映射配置之后,速度立马变得飞快,而 Executed DbCommand 执行时间从 9,947ms 飞流直下 2ms ,原来是 AutoMapper 惹的祸!

[Information] Executed DbCommand ("2"ms) [Parameters=["@__p_3='20'"], CommandType='Text', CommandTimeout='30']"

而同样的代码在 .NET Framework 中没这个问题,看来是 AutoMapperEF Core 相处不融洽。

原因已经找到,那如何解决或避开这个问题呢?这时想到了刚认识不久了解不多的新朋友 —— Mapster ,换上对象映射界的新秀 Mapster 试试。

ProjectTo 改为 ProjectToType ,并如下配置映射关系:

TypeAdapterConfig<BlogPost, BlogPostDto>.ForType()
    .Map(dest => dest.AuthorUrl, src => "https://www.cnblogs.com/" + src.BlogSite.Application + "/");

运行后惊喜地发现 Mapster 没这个问题,多次运行 Executed DbCommand 都在 10ms 以内,千倍之差,让人眼前一亮的新秀。

[Information] Executed DbCommand ("2"ms) [Parameters=["@__p_3='20'"], CommandType='Text', CommandTimeout='30']"

在这冬去春来之际,由于遇到这个问题,也到了我们辞去 AutoMapper 迎来 Mapster 的时候。

原文地址:https://www.cnblogs.com/dudu/p/10449485.html

时间: 2024-10-12 16:56:54

EF Core 相关的千倍性能之差: AutoMapper ProjectTo VS Mapster ProjectToType的相关文章

ef core 相关

1.为什么使用ef core? 市面上orm框架那么多,为何偏偏选择ef,dapper那么好用,性能碾压ef,为什么使用dapper? 对于这个问题我记得当初一个老师讲entityframework的时候讲过这么一个故事: 1)一个公司的老板让开发部开发一个软件,一开始的数据库的技术栈:ado.net,当项目真正要用的时候,老板发现sqlserver的费用让他有点不情愿,同样是数据库人家mysql为什么不要钱,所以勒令开发部把数据库换成mysql,从中省下来的钱一部分作为奖金(呵呵哒~),开发部

asp.net core+ef core

asp.net core+ef core 官方的文档https://docs.asp.net/en/latest/tutorials/first-mvc-app/start-mvc.html 先来看一下实现的效果 开始之前,确定本机已经有.NET Core环境.https://www.microsoft.com/net/core#windows 1.创建解决方案的文件结构如下图(模糊处理的过文件是自己后面加的和ef生成的). 2.要使用ef core,先引用ef core相关的程序包.https

在vs2015上使用asp.net core+ef core

官方的文档https://docs.asp.net/en/latest/tutorials/first-mvc-app/start-mvc.html 先来看一下实现的效果 开始之前,确定本机已经有.NET Core环境.https://www.microsoft.com/net/core#windows 1.创建解决方案的文件结构如下图(模糊处理的过文件是自己后面加的和ef生成的). 2.要使用ef core,先引用ef core相关的程序包.https://docs.efproject.net

EF Core 2.1 中的新增功能(2)

安装 EF Core 将 EF Core 添加到不同平台和常用 IDE 中的应用程序的所需步骤汇总. 分步入门教程 无需具备 Entity Framework Core 或任何特定 IDE 的原有知识,即可学习这些入门教程. 这些教程将逐步介绍如何创建用于查询和保存数据库中数据的简单应用程序. 我们已提供许多教程,指导你开始使用各种操作系统和应用程序类型. Entity Framework Core 可基于现有数据库创建模型,也可基于模型创建数据库. 提供的教程演示了这两种方法. .NET Fr

(3).Net Core的EF Core的使用

EF Core(Entity Framework Core)是 EF 的.net core 版本.EF Core 对 SQLServer 支持很好,也可以在Linux下连接SQLServer.不过如果在Linux下首选MySQL,因此这次试一试MYSQL. EFCore 的 Nuget: Microsoft.EntityFrameworkCore(一般不需要单独安装,安装mysql的包的时候会把相关依赖的包自动下载下来). 官 方 的 mysql  ef  provider经网上查资料网友告知还

net Core 通过 Ef Core 访问、管理Mysql

net Core 通过 Ef Core 访问.管理Mysql 本文地址:http://www.cnblogs.com/likeli/p/5910524.html 环境 dotnet Core版本:1.0.0-preview2-003131 本文分为Window环境和Mac Os X环境. 相关资源下载 Visual Studio Code:https://code.visualstudio.com DotNet Core:https://dotnet.github.io/ MySql.Data.

EntityFramework Core技术线路(EF7已经更名为EF Core,并于2016年6月底发布)

官方文档英文地址:https://github.com/aspnet/EntityFramework/wiki/Roadmap 历经延期和更名,新版本的实体框架终于要和大家见面了,虽然还有点害羞.请大家多体谅! 下面正式进入主题: Entity Framework Core (EF Core) 下面是EF Core 的计划和技术线路,注意,这些计划是可能发现变化的,因为很多事是很难预测的.即便如此,我们还是尽可能保持计划的公开和透明,以解大家对EF Core期望,以及做出相应的安排. Sched

一步步学习EF Core(1.DBFirst)

前言 很久没写博客了,因为真的很忙,终于空下来,打算学习一下EF Core顺便写个系列, 今天我们就来看看第一篇DBFirst. 本文环境:VS2017  Win7  .NET Core1.1    EF Core1.1.2 正文 这里我们不讨论是用DBFirst好,还是CodeFirst高端..各有各自的用处和适用场景.. 我们单纯的只是来使用这个DBFirst.. 既然是DBFirst,那么在用DBFirst之前..首先你要有一个数据库(嗯,废话) 其次,如果你是Windows7系统 那么需

[转]EntityFramework Core技术线路(EF7已经更名为EF Core,并于2016年6月底发布)

本文转自:http://www.cnblogs.com/VolcanoCloud/p/5572408.html 官方文档英文地址:https://github.com/aspnet/EntityFramework/wiki/Roadmap 历经延期和更名,新版本的实体框架终于要和大家见面了,虽然还有点害羞.请大家多体谅! 下面正式进入主题: Entity Framework Core (EF Core) 下面是EF Core 的计划和技术线路,注意,这些计划是可能发现变化的,因为很多事是很难预测