1、简单 count 会生成不必要的嵌套

var xs = (from x in dbContext.db_API_Operationallog where x.id<1  select 1 ).Count();

结果:

SELECT
[GroupBy1].[A1] AS [C1]
FROM ( SELECT
COUNT(1) AS [A1]
FROM [dbo].[db_API_Operationallog] AS [Extent1]
WHERE [Extent1].[id] < 1
) AS [GroupBy1]

2、查询某些列的时候会整个模型查询

    context.db_API_Operationallog.FirstOrDefault(p => p.Id == postId).Hits;
或者:
context.db_API_Operationallog.Find(postId).Hits;

会把整个post表数据都查出然后再内存里面找了hits这个列

优化:

    context.db_API_Operationallog.Where(p => p.Id == postId).Select(p => p.Hits).FirstOrDefault();

3、不要轻易的把数据全部加载到内存

有时候一个不小心在查询的sql build 里面加了个tolist(), toArray()等,这种真正的执行了查询,这样在开发环境往往表的数据比较少,程序运行比较快,但是一到线上环境数据量比较大的情况下就会出现内存爆满的问题,这个问题相对来说比较隐蔽,所以开发的时候一定要小心。

4、IQueryable, IEnumerable

IEnumerable 执行的where 先是走内存,在走内存查询

    public IEnumerable<db_API_Operationallog> GetAllPost()
{
return context.Post;
} int id = 2000;
var log = GetAllPost().Where(s => s.id <id).ToList();

Sql Server Profiler 抓到的信息

 SELECT
[Extent1].[id] AS [id],
[Extent1].[uid] AS [uid],
[Extent1].[types] AS [types],
[Extent1].[events] AS [events],
[Extent1].[more] AS [more],
[Extent1].[money] AS [money],
[Extent1].[lastmoney] AS [lastmoney],
[Extent1].[nowmoney] AS [nowmoney],
[Extent1].[bak] AS [bak],
[Extent1].[times] AS [times]
FROM [dbo].[db_API_Operationallog] AS [Extent1]

把上面的 IEnumerable 换成 IQueryable

exec sp_executesql N'SELECT
[Extent1].[id] AS [id],
[Extent1].[uid] AS [uid],
[Extent1].[types] AS [types],
[Extent1].[events] AS [events],
[Extent1].[more] AS [more],
[Extent1].[money] AS [money],
[Extent1].[lastmoney] AS [lastmoney],
[Extent1].[nowmoney] AS [nowmoney],
[Extent1].[bak] AS [bak],
[Extent1].[times] AS [times]
FROM [dbo].[db_API_Operationallog] AS [Extent1]
WHERE [Extent1].[id] < @p__linq__0',N'@p__linq__0 int',@p__linq__0=2000

这个坑是比较同样也是比较隐蔽的注意下

5、使用 NoTracking 降低 状态开销

  dbContext.db_API_Operationallog.Where(s => s.id < id).AsNoTracking().ToList();

总结

平时写EF的时候一定要把脚步停下了 多使用 Sql Server Profiler 琢磨下自己的代码

EF 剥坑的更多相关文章

  1. EF6+MYSQL之初体验

    初次使用EF6+MYSQL 这次的项目时间可拉得够长的,定制开发就是这样.客户真正用上了才能基本上不再改了.起先项目是php实现的,改造成桌面程序.用.net winform开发,像这种小项目肯定要用 ...

  2. .Net Core2.2升级到3.1小记

    .NET Core 3.1 作为LTS长期支持版本,会提供3年的支持(明年就出.net5),值得升级(吗). 目前主流的第三方包大多都已经提供了支持,2.x => 3.1还是变化不是特别多,EF ...

  3. %E3%80%90%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B%E3%80%91

    "%3Cdiv%20class%3D%22htmledit_views%22%20id%3D%22content_views%22%3E%0A%20%20%20%20%20%20%20%20 ...

  4. .NetCore之EF跳过的坑

    我在网上看到很多.netCore的信息,就动手自己写一个例子测试哈,但是想不到其中这么多坑: 1.首先.netCore和EF的安装就不用多说了,网上有很多的讲解可以跟着一步一步的下载和安装,但是需要注 ...

  5. EF双向一对一中的坑

    EF版本 6.0 在项目中双向一对一关系是普遍存在的,如果不仔细检查,并不容易发现这个坑 下面新建两个类(假设这两个类是一对一的关系)对应实体都设置为可延迟加载 映射关系为: 再建一个数据访问类: 运 ...

  6. VS2017+EF+Mysql生成实体数据模型(解决闪退的坑) 版本对应才行

    最近要使用VS2017+EF+Mysql,在生成实体数据模型踏过一些坑,在此做个总结. 1.先下载并安装 mysql-connector-net-6.9.10.msi  和  mysql-for-vi ...

  7. VS2017 + EF + MySQL 我使用过程中遇到的坑

    原文:VS2017 + EF + MySQL 我使用过程中遇到的坑 写在前面: 第一次使用MySQL连接VS的时候本着最新版的应该就是最好的,在MySQL官网下载了最新版的MySQL没有并且安装完成之 ...

  8. VS2017+EF+Mysql生成实体数据模型(解决闪退的坑)

    原文:VS2017+EF+Mysql生成实体数据模型(解决闪退的坑) 最近要使用VS2017+EF+Mysql,在生成实体数据模型踏过一些坑,在此做个总结. 1.先下载并安装 mysql-connec ...

  9. EF Core 3.0 Preview 9 的2个小坑

    之前我们的数据库服务器使用的是 SQL Server 2008 R2 ,由于从 EF Core 3.0 Preview 6 开始不支持 UseRowNumberForPaging ,只能停留在 EF ...

随机推荐

  1. 前端基础----JavaScript基础

    一.JavaScript概述 1,JavaScript的历史 1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中).后将其改名ScriptEa ...

  2. OpenCV图像变换(仿射变换与透视变换)

    仿射变换(affine transform)与透视变换(perspective transform)在图像还原.图像局部变化处理方面有重要意义.通常,在2D平面中,仿射变换的应用较多,而在3D平面中, ...

  3. jsp 的 7 个动作指令

    动作指令与编译指令不同,编译指令是通知 Servlet 引擎的处理消息,而动作指令只是运行时的动作.编译指令在将 JSP 编译成 Servlet 时起作用:而处理指令通常可替换成 JSP 脚本,它只是 ...

  4. hexo搭建个人博客

    本文讲述如何用`hexo`搭建个人博客,并托管到`github`.不需要租赁服务器,可完成网站博客的搭建. 安装Hexo安装hexo之前,要先下载安装Node.js和Git,百度搜索找到下载即可.[G ...

  5. Kubernetes 1.5通过Ceph实现有状态容器

    在上一篇博文,我们通过kubernetes的devlopment和service完成了sonarqube的部署.看起来已经可用,但是仍然有一个很大的问题.我们知道,像mysql这种数据库是需要保存数据 ...

  6. mysql 查询小demo

    两张表的的结构如下,需求是写出从one表到two表和从two表到one表的查询转换. create table student_one( name varchar(50) default '' not ...

  7. 海思HI35XX之----视频处理单元各通道间的关系

    最近在折腾HI3518C的芯片,应用到IPCamera上,最终获取多路不同分辨率的视频流供不同需求的预览切换.此处简单记录一下视频前处理元VPSS(Video Process Sub-System)的 ...

  8. DialogFragment 将数据传回Activity的onActivityResult方法

    在MyActivity中 弹出一个DialogFragment (某一个控件的点击事件) search= findViewById(R.id.search); search.setOnClickLis ...

  9. 数学:Nim游戏和SG函数

    有若干堆石子,两人轮流从中取石子,取走最后一个石子的人为胜利者 以下的性质是显然的 .无法移动的状态是必败态 .可以移动到必败态的局面一定是非必败态 .在必败态做所有操作的结果都是非必败态 在普通Ni ...

  10. JavaScript入门笔记(一)

    JavaScipt 2.1 javascript的组成部分 ECMAScript: 它是整个 javascript 的核心,包含(基本语法.变量.关键字.保留字.数据类型.语句.函数等等)DOM:文档 ...