EF 剥坑
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 剥坑的更多相关文章
- EF6+MYSQL之初体验
初次使用EF6+MYSQL 这次的项目时间可拉得够长的,定制开发就是这样.客户真正用上了才能基本上不再改了.起先项目是php实现的,改造成桌面程序.用.net winform开发,像这种小项目肯定要用 ...
- .Net Core2.2升级到3.1小记
.NET Core 3.1 作为LTS长期支持版本,会提供3年的支持(明年就出.net5),值得升级(吗). 目前主流的第三方包大多都已经提供了支持,2.x => 3.1还是变化不是特别多,EF ...
- %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 ...
- .NetCore之EF跳过的坑
我在网上看到很多.netCore的信息,就动手自己写一个例子测试哈,但是想不到其中这么多坑: 1.首先.netCore和EF的安装就不用多说了,网上有很多的讲解可以跟着一步一步的下载和安装,但是需要注 ...
- EF双向一对一中的坑
EF版本 6.0 在项目中双向一对一关系是普遍存在的,如果不仔细检查,并不容易发现这个坑 下面新建两个类(假设这两个类是一对一的关系)对应实体都设置为可延迟加载 映射关系为: 再建一个数据访问类: 运 ...
- VS2017+EF+Mysql生成实体数据模型(解决闪退的坑) 版本对应才行
最近要使用VS2017+EF+Mysql,在生成实体数据模型踏过一些坑,在此做个总结. 1.先下载并安装 mysql-connector-net-6.9.10.msi 和 mysql-for-vi ...
- VS2017 + EF + MySQL 我使用过程中遇到的坑
原文:VS2017 + EF + MySQL 我使用过程中遇到的坑 写在前面: 第一次使用MySQL连接VS的时候本着最新版的应该就是最好的,在MySQL官网下载了最新版的MySQL没有并且安装完成之 ...
- VS2017+EF+Mysql生成实体数据模型(解决闪退的坑)
原文:VS2017+EF+Mysql生成实体数据模型(解决闪退的坑) 最近要使用VS2017+EF+Mysql,在生成实体数据模型踏过一些坑,在此做个总结. 1.先下载并安装 mysql-connec ...
- EF Core 3.0 Preview 9 的2个小坑
之前我们的数据库服务器使用的是 SQL Server 2008 R2 ,由于从 EF Core 3.0 Preview 6 开始不支持 UseRowNumberForPaging ,只能停留在 EF ...
随机推荐
- git untrack file
git update-index should do what you want This will tell git you want to start ignoring the changes t ...
- CSS3笔记-加强版
属性选择器: E[attr]只使用属性名,但没有确定任何属性值 E[attr="value"]指定属性名,并指定了该属性的属性值 E[attr~="value&quo ...
- Mybatis批量删除之Error code 1064, SQL state 42000;
(一)小小的一次记载. (二):最近的项目都是使用MyBatis,批量新增自己都会写了,但是一次批量删除可把我给折腾了下,写法网上都有,但是照着做就是不行,最后问公司的人,问网友才得到答案,那就是jd ...
- 图论&搜索:K短路-启发式搜索
判断第k短路的权值是否小于T 直接把队友的代码拿过来了,一定很经典 #include <iostream> #include <queue> #include <cstr ...
- 前端观察:HTML5做得好,收入不比 iOS 差
谷歌奋进的绿色机器人超过了苹果的市场占有率,这一市场现象,导致了愈来愈多的开发者转投html5的怀抱.而HTML5将成为开发者拥抱同时拥抱Android和IOS的不二法门. 根据著名移动生态系统分析公 ...
- DOM基础操作
本文地址:http://www.cnblogs.com/veinyin/p/7606972.html 1 访问 HTML 元素 常用方法 document.getElementById(" ...
- ActiveMQ笔记之安装(Linux)
1. 基本概念 MQ(MessageQueue),消息队列,是一个消息接收和转发的容器. Apache ActiveMQ是一个JMS Provider实现. 2. 安装 从官网下载安装包: wget ...
- c语言学习笔记.关键字.存储类型关键字等
关键字const 1.修饰变量. 修饰的对象为常量,只读. 2.修饰指针. const 也可以和指针变量一起使用,这样可以限制指针变量本身,也可以限制指针指向的数据. const 离变量名近就是用来修 ...
- ACM-ICPC北京赛区2018重现赛 A题
题目链接:http://hihocoder.com/contest/icpcbeijing2018/problem/1 具体思路:dfs,判断矛盾就可以了. AC代码: #include<ios ...
- BZOJ 3958 Mummy Madness
Problem BZOJ Solution 算法:二分+扫描线 快要2019年了,就瞎写一篇博客来凑数,不然感觉太荒凉了-- 答案是可二分的,那么二分的依据是什么呢?不妨设当前二分的答案为\(mid\ ...