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. 使用 css 的 keyframe 实现 loading 动画

    效果查看:https://jsfiddle.net/rubys/je16qL5k/6/ <!DOCTYPE html> <html lang="en"> & ...

  2. ROC 曲线/准确率、覆盖率(召回)、命中率、Specificity(负例的覆盖率)

      欢迎关注博主主页,学习python视频资源 sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频教程) https://study.163.com/course/introduction.ht ...

  3. word2vec 和 doc2vec 词向量表示

    Word2Vec 词向量的稠密表达形式(无标签语料库训练) Word2vec中要到两个重要的模型,CBOW连续词袋模型和Skip-gram模型.两个模型都包含三层:输入层,投影层,输出层. 1.Ski ...

  4. svn常见错误

    1.svn提交报错:svn: Aborting commit:XXXXXremains in conflict 解决:说明Svn服务器上的对应内容,在你上次Update后已被别人修改了,而你也做了修改 ...

  5. 维护后面的position sg函数概念,离线+线段 bzoj 3339

    3339: Rmq Problem Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1160  Solved: 596[Submit][Status][ ...

  6. 解决Ubuntu终端里面显示路径名称太长

    方法/步骤 找到配置文件先进行备份:  cp  ~/.bashrc  ~/.bashrc-bak 找到配置文件修改: vi  ~/.bashrc 备份是为了防止配置修改出错,可以还原: 下面是我的/h ...

  7. [php]http的状态码

    1.分类 100~199 表示成功接受请求,要求客户端继续提交下一次请求才能完成整个过程处理. 200~299 表示成功接收请求并已完成整个处理过程,常用200 300~399 为完成请求,客户需进一 ...

  8. 【leetcode 简单】第十二题 报数

    报数序列是指一个整数序列,按照其中的整数的顺序进行报数,得到下一个数.其前五项如下: 1. 1 2. 11 3. 21 4. 1211 5. 111221 1 被读作  "one 1&quo ...

  9. 【leetcode 简单】 第八题 删除排序数组中的重复项

    给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成. 示例 1 ...

  10. php常用函数——数组函数

    php常用函数——数组函数