之前我们的数据库服务器使用的是 SQL Server 2008 R2 ,由于从 EF Core 3.0 Preview 6 开始不支持 UseRowNumberForPaging ,只能停留在 EF Core 3.0 Preview 5 ,无法继续升级。后来终于将数据库升级到了 SQL Server 2016 ,赶紧将 EF Core 升级到最新版 3.0 Preview 9 ,结果却发现了 EF Core 3.0 Preview 9 的2个小坑(3.0 正式版中也存在)。

第1个小坑

EF Core 3.0 会生成的多余 IS NOT NULL ,让生成的 SQL 语句非常啰嗦,冗长得不忍目睹。

SELECT ...
FROM [blog_Content] AS [b]
WHERE ((((([b].[BlogID] = @__blogId_0) AND @__blogId_0 IS NOT NULL) AND ([b].[IsExist] = CAST(1 AS bit))) AND (((([b].[PostType] | @__type_1) = @__type_1) AND ([b].[PostType] | @__type_1 IS NOT NULL AND @__type_1 IS NOT NULL)) OR ([b].[PostType] | @__type_1 IS NULL AND @__type_1 IS NULL))) AND (((([b].[PostConfig] & @__config_2) = @__config_2) AND ([b].[PostConfig] & @__config_2 IS NOT NULL AND @__config_2 IS NOT NULL)) OR ([b].[PostConfig] & @__config_2 IS NULL AND @__config_2 IS NULL)))

github 上的相关 issue: Queries really slow due to null checks

注:这个坑坑人不浅,会造成 SQL Server 数据库 CPU 100% ,详见 阿里云 RDS 数据库又发 CPU 近 100% 的“芯脏病”

第2个小坑

EF Core 3.0 对 Projection 的支持有问题,不管 Mapster 的 ProjectToType 还是 AutoMapper 的 ProjectTo ,生成的 SQL 语句中 SELECT 的是实体的字段,而不是 DTO 的字段,比如下面的 SQL 语句。

SELECT DTO字段
FROM (
SELECT TOP(@__p_3) 实体字段
FROM [blog_Content] AS [b]
LEFT JOIN [blog_DiggScore] AS [b0] ON [b].[Id] = [b0].[EntryID]
WHERE ...
ORDER BY [b0].[DiggCount] DESC
) AS [t]
LEFT JOIN [blog_DiggScore] AS [b1] ON [t].[Id] = [b1].[EntryID]
ORDER BY [t].[DiggCount] DESC

后来同事排查后发现,把 ProjectToType 移动到 OrderBy 以及 Take/Skip 语句之前可以避开这个问题。

EF Core 3.0 Preview 9 的2个小坑的更多相关文章

  1. .NetCore技术研究-EntityFramework Core 3.0 Preview

    前段时间.Net Core 3.0 发布了,Entity Framework Core 3.0 也发布了Preview版.假期用了一上午大致研究了一遍,同时又体验了一把Visual Studio 20 ...

  2. 【译】宣告推出.NET Core 3.0 Preview 7(英雄的黎明)

    今天,我们宣布推出.NET Core 3.0 Preview 7.我们已经从创建新特性阶段过渡到了完善版本阶段.对于其余的预览版,我们将把重点放在质量(改进)上. 在Windows,macOS和Lin ...

  3. [翻译] .NET Core 3.0 Preview 7 发布

    原文: Announcing .NET Core 3.0 Preview 7 今天,我们宣布推出 .NET Core 3.0 Preview 7 .我们的工作已经从创建新功能过渡到打磨版本.预计剩余的 ...

  4. [翻译] .NET Core 3.0 Preview 9 发布

    原文: Announcing .NET Core 3.0 Preview 9 今天,我们宣布推出 .NET Core 3.0 Preview 9.就像 Preview 8 一样,我们专注于打磨 .NE ...

  5. .NET Core 3.0 Preview 9 发布

    翻译自官方博客 今天,我们宣布推出.NET Core 3.0 Preview 9.就像预览版8一样,我们专注打磨最终版本的.NET Core 3.0,而不是添加新功能.如果这些最终版本看起来不像早期预 ...

  6. .Net Core-3.0-新闻:宣告推出.NET Core 3.0 Preview 7

    ylbtech-.Net Core-3.0-新闻:宣告推出.NET Core 3.0 Preview 7  1.返回顶部 1. 今天,我们宣布推出.NET Core 3.0 Preview 7.我们已 ...

  7. 【译】Announcing Entity Framework Core 5.0 Preview 5

    今天我们宣布EF Core 5.0发布第五个预览版. 1 先决条件 EF Core 5.0 的预览版要求  .NET Standard 2.1.这意味着: EF Core 5.0 在 .NET Cor ...

  8. EF Core 1.0 和 SQLServer 2008 分页的问题

    EF Core 1.0 在sqlserver2008分页的时候需要指定用数字分页. EF Core1.0 生成的分页语句中使用了 Featch Next.这个语句只有在SqlServer2012的时候 ...

  9. ASP.NET Core 开发-Entity Framework (EF) Core 1.0 Database First

    ASP.NET Core 开发-Entity Framework Core 1.0 Database First,ASP.NET Core 1.0 EF Core操作数据库. Entity Frame ...

随机推荐

  1. Python Exception处理

    Python中的错误处理分为两类:语法错误和异常处理.语法错误一般是指由于python语句.表达式.函数等存在书写格式活语法规则上的错误抛出的异常,如python常见的缩进控制,若同层次的执行语句存在 ...

  2. 【Spring Cloud】Spring Cloud Config 实现分布式配置中心

    Spring Cloud Config 实现分布式配置中心 一.分布式配置中心 分布式系统中,往往拥有大量的服务应用,而每个应用程序都需要有对应的配置文件来协助完成服务环境初始化.运行.因此生产了大量 ...

  3. 基于django中间件的编程思想

    目录 前言 前期准备 importlib模块介绍 基于django中间件的编程思想 django中settings源码 配置文件的插拔式设计 基于django中间件的思想,实现功能配置 前言 在学习d ...

  4. windows的两种sshd服务器安装

    关于windows的服务器,后来好像微软发布了专用的windows ssh服务器组件.通过win 10的linux子系统因该是可以安装ssh服务器.这两种都没有使用过. 有一个freesshd的免费软 ...

  5. 以太坊智能合约开发 Solidity学习

    1. pragma solidity >=0.4.22 <0.6.0;//版本号,头文件 contract BooleanTest { bool _a;//默认返回false int nu ...

  6. easyswoole对接支付宝,微信支付

    在easyswoole中,已经开发好了相关的支付组件,只需要引入即可: composer require easyswoole/pay pay组件支持协程 支付宝 支付方法 支付宝支付目前支持 7 种 ...

  7. 对cookie-parser的理解(签名、加密)

    1.为什么说要利用签名防止cookie被恶意篡改 我们在浏览器输入用户名和密码发送post请求到后端服务器,后端服务器验证合法,返回响应,并Set-Cookie为sessionid=***;usern ...

  8. Vue的MVVM框架理解

    图示 只上图,请不要怪楼主懒. 这是楼主梳理后画的,因为毕竟自己画的印象深刻,更觉得香啊. 黄线: 表示View->Model, 红线: 表示Model->View 具体代码,请查看Vue ...

  9. 利用Azure虚拟机安装Dynamics 365 Customer Engagement之五:安装SQL Server

    我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...

  10. JAVA微信企业付款到零钱(十分钟搞定),附完整DEMO下载

    最近帮朋友做了一个简单的微分销系统,实现从企业付款到零钱分润的功能,简单记录一下微信企业付款到零钱的开发过程, 主要就是按规则封装好请求参数调用微信接口,涉及一些签名校验: A.接口流程 1. 获取用 ...