博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Entity Framework Core的坑:Skip/Take放在Select之前造成Include的实体全表查询
阅读量:6975 次
发布时间:2019-06-27

本文共 979 字,大约阅读时间需要 3 分钟。

今天将一个迁移至 ASP.NET Core 的项目放到一台 Linux 服务器上试运行。站点启动后,浏览器打开一个页面一直处于等待状态。接着奇怪的事情发生了,整个 Linux 服务器响应缓慢,ssh命令行输入都一顿一顿的,过了一会,直接停止响应,down机了,必须强制重启服务器才行。再启动站点,再访问,问题依旧。换一台服务器,down机依然。

排查时在日志中发现了这样的报警:

warn: Microsoft.EntityFrameworkCore.Query.Internal.SqlServerQueryCompilationContextFactory[8]The LINQ expression 'xxx' could not be translated and will be evaluated locally.

然后用 SQL Profiler 跟踪了一下 EF Core 生成的 SQL 语句,发现了一条全表查询的SQL语句,而这张表有80多万条数据。罪魁祸首就是它,在内存中加载80多万条数据进行查询,结果把只有1核1G的Linux服务器搞挂了。

这个项目之前用的是基于 .NET Framework 的 Entity Framework ,并没有出现这个问题。换成 Entity Framewor Core 怎么就变卦了呢?

后来在GitHub上发现了线索 —— :

If possible, you should always try to put Skip/Take/Distinct as the last operation when using EF Core (at least until we address the current limitations).

在我们这个项目中的确存在将 Skip/Take 放在 Select 之前的 LINQ 查询代码,修改之后问题立马解决。而发生全表查询的数据库表所对应的实体,是在 LINQ 中 Include 进来的(Eager loading)。

这是目前版本的 EF Core 的一个坑,使用时需注意。建议使用 EF Core 时,一定要看日志中 EF Core 的报警信息。 

转载于:https://www.cnblogs.com/dudu/p/6402169.html

你可能感兴趣的文章
qemu:///system 没有连接驱动器可用;读取数据时进入文件终点: 输入/输出错误
查看>>
json xmpp
查看>>
【转载】Node.js + WebSocket 实现的简易聊天室
查看>>
理解MapReduce计算构架
查看>>
移动端资源集锦
查看>>
Java 吸血鬼数字
查看>>
架构设计--用户端全http參数接口具体说明v1
查看>>
Python之日期与时间处理模块(date和datetime)
查看>>
RMAN数据库恢复之丢失数据文件的恢复
查看>>
javabeans 内省 introspector BeanUtils
查看>>
跑马灯效果的TextView之singLine 和maxLines
查看>>
(转载)oracle字符集理解
查看>>
《红黑树》学习心得
查看>>
高斯消元
查看>>
2017年寒假作业(一)
查看>>
Could not find a matching subscription for the message.
查看>>
Python开发【项目】:选课系统
查看>>
如果用 索引的话,这个太不方便了,草,
查看>>
java 返回年月的第一天 和最后一天【转载】
查看>>
python--django模板(model)
查看>>