暗中认可使用的EF6.0版本

【转】你必须要精晓的EF知识和经历

留意:以下内容如果未有特别证明,私下认可使用的EF6.0版本,code first情势。

推荐MiniProfiler插件

工欲善其事,必先利其器。

咱俩选拔EF和在不小程度进步了花费进程,不过随后拉动的是大多性质低下的写法和转换不太高速的sql。

虽说大家得以应用SQL Server
Profiler来监控施行的sql,但是个人感到正是麻烦,每一趟供给开发、过滤、消弭、关闭。

在这处猛烈推荐二个插件MiniProfiler。实时监督页面诉求对应举行的sql语句、实践时间。轻便、方便、指向性强。

如图:(切切实实行使和介绍请移步)

澳门黄冠娱乐备用网址 1

多少希图

新建实体:Score(成绩分数表卡塔尔国、Student(学子表卡塔 尔(阿拉伯语:قطر‎、Teacher(老师表卡塔 尔(阿拉伯语:قطر‎

澳门黄冠娱乐备用网址 2

前边会给出demo代码下载链接

foreach循环的陷进 

1.关于推迟加载

澳门黄冠娱乐备用网址 3

请看上图红框。为何StudentId有值,而Studet为null?因为使用code
first,须求安装导航属性为virtual,才会加载延迟加载数据。

澳门黄冠娱乐备用网址 4

2.关于在循环中拜候导航属性的不胜管理(接着上边,加上virtual后会报以下卓殊卡塔 尔(英语:State of Qatar)

“原来就有展开的与此 Command 相关联的
DataReader,必得首先将它倒闭。”

澳门黄冠娱乐备用网址 5

应用方案:

  • 方案1、设定ConnectionString加上MultipleActiveResultSets=true,但只适用于SQL
    二零零六后头的版本
  • 方案2、或然先读出放置在List中

3.上述两点仅为热身,大家说的陷阱才刚刚开头!

澳门黄冠娱乐备用网址 6

下一场大家点击张开迷你Profiler工具(不要被吓到卡塔尔

澳门黄冠娱乐备用网址 7

澳门黄冠娱乐备用网址 8

实施方案:使用Include显示接二连三查询(注意:须求手动导入using System.Data.Entity
不然Include只可以传表名字符串卡塔 尔(英语:State of Qatar)。

澳门黄冠娱乐备用网址 9

再看迷你Profiler的督察(弹指间101条sql产生了1条,那其间的习性显而易见。卡塔 尔(英语:State of Qatar)

澳门黄冠娱乐备用网址 10

AutoMapper工具

上面大家通过Include显示的实践表的总是查询分明是理之当然的,但还远远不足。假诺我们只供给查询数据的有个别字段呢,上边查询全部字段岂不是很浪费内部存款和储蓄器存款和储蓄空间和应用程序与数据库数据传输带宽。

我们能够:

澳门黄冠娱乐备用网址 11

对应监督到的sql:

澳门黄冠娱乐备用网址 12

咱们来看变化的sql,查询的字段少了超多。独有我们来得列出来字段的和多个StudentId,StudentId用来延续查询条件的。

无可争辩,那样的办法很科学。然则有未有何更加好的方案或格局啊?答案是必定的。(不然,也不会在那处屁话了。卡塔 尔(英语:State of Qatar)倘使表字段超级多,大家必要利用的字段也要命多,导航属性也要命多的时候,那样的手动映射就呈现不那么狼狈了。那么接下去大家开头介绍使用AutoMapper来产生映射:

瞩目:首先要求NuGet下载AutoMapper。(然后导入命名空间 using
AutoMapper; using AutoMapper.QueryableExtensions;卡塔尔

澳门黄冠娱乐备用网址 13

澳门黄冠娱乐备用网址 14

咱俩见到地点查询语句未有三个个的手动映射,而映射都以单独陈设了。个中CreateMap应该是要写到Global.asax文件之中的。(其实也正是分开了酷炫部分,清晰了询问语句。留意的同室恐怕注意到了,这种方式还免去了积极向上Include卡塔 尔(阿拉伯语:قطر‎

澳门黄冠娱乐备用网址 15

大家来看了扭转的sql和日前有个别许例外,但只生成了一条sql,并且结果也是不利的。(其实正是多了一条CASE WHEN ([Extent2].[Id] IS
NOT NULL) THEN 1 END AS
[C1]。看起来那条语句并从未什么样实际意义,可是那是AutoMapper生成的sql,同期自身也象征不精晓为何和EF生成的不等)

这么做的裨益?

  1. 幸免在循环中访问导航属性数次实施sql语句。
  2. 防止了查询语句中太多的手动映射,影响代码的翻阅。

关于AutoMapper的其余界分材质:

http://www.cnblogs.com/xishuai/p/3712361.html

http://www.cnblogs.com/xishuai/p/3700052.html

http://www.cnblogs.com/farb/p/AutoMapperContent.html

联表查询总括

须要:查询前玖拾柒个学子考试体系(“模拟考试”、“正式考试”卡塔尔国、考试次数、语文平均分、学子姓名,且考试次数超越等于3次。(按考试项目分类总括卡塔尔国

代码如下:

澳门黄冠娱乐备用网址 16

看样子那样的代码,笔者第一反应是惨了。又在循环实施sql了。监控如下:

澳门黄冠娱乐备用网址 17

骨子里,大家只供给有个别校正就把101条sql变成1条,如下:

澳门黄冠娱乐备用网址 18

马上变1条。

澳门黄冠娱乐备用网址 19

大家开垦查看详细的sql语句

澳门黄冠娱乐备用网址 20

澳门黄冠娱乐备用网址,开掘那仅仅只是查询结果集结而已,个中的按考试项目来总结是前后相继得到具有数据后在思考的(实际不是在数据库内总结,然后径直回到结果卡塔 尔(英语:State of Qatar),那样平等是浪费了数据库查询数据传输。

关于连接查询分组总括我们能够动用SelectMany,如下:

澳门黄冠娱乐备用网址 21

监察sql如下:(是否简练多了吧?卡塔尔

澳门黄冠娱乐备用网址 22

关于SelectMany资料:

http://www.cnblogs.com/lifepoem/archive/2011/11/18/2253579.html

http://www.cnblogs.com/heyuquan/p/Linq-to-Objects.html

属性升高之AsNonUnicode

澳门黄冠娱乐备用网址 23

监督到的sql

澳门黄冠娱乐备用网址 24

俺们看来EF符合规律处境变化的sql会在眼下带上“N”,假使大家增多DbFunctions.AsNonUnicode生成的sql是从未有过“N”的,当你发觉带上“N”的sql比尚未带“N”的
sql查询速度慢相当多的时候那就精晓该如何做。

(在此以前用oracle的时候带不带“N”查询效用差距特别扎眼,前天用sql
server测验并从未察觉怎么差距澳门黄冠娱乐备用网址 25。还恐怕有本身开掘EF6会依照数据库中是nvarchar的时候才会生成带“N”的sql,oracle数据库没测验,有意思味的同学能够测量检验下卡塔 尔(英语:State of Qatar)

特性提高之AsNoTracking

澳门黄冠娱乐备用网址 26

大家看变化的sql

澳门黄冠娱乐备用网址 27

sql是浮动的一模一样,不过实践时间却是4.8倍。原因仅仅只是第一条EF语句多加了二个AsNoTracking。

注意:

  • AsNoTracking干什么的吧?无追踪查询而已,也正是说查询出来的目标不能够间接做校订。所以,大家在做多少群集查询显示,而又无需对聚集修正并更新到数据库的时候,一定毫无遗忘加上AsNoTracking。
  • 只要查询进度做了select映射就无需加AsNoTracking。如:db.Students.Where(t=>t.Name.Contains(“张三”)).select(t=>new
    (t.Name,t.Age)).ToList();

多字段组合排序(字符串卡塔尔国

务求:查询名字里面富含“张三”的学子,先按名字排序,再按年龄排序。

澳门黄冠娱乐备用网址 28

澳门黄冠娱乐备用网址 29

嘿,不对啊。按名字排序被年龄排序覆盖了。大家相应用ThenBy来构成排序。

澳门黄冠娱乐备用网址 30

澳门黄冠娱乐备用网址 31

不错不错,就是大家想要的效率。如若您不想用ThenBy,且都是升序的话,大家也得以:

澳门黄冠娱乐备用网址 32

澳门黄冠娱乐备用网址 33

调换的sql是相近的。与OrderBy、ThenBy对应的降序有OrderByDescending、ThenByDescending。

贴近好像很周全了。其实不然,大家大部分情景排序是动态的。譬如,我们会更加的前端页面分裂的操作供给分歧字段的例向外排水序。那大家后台应该怎么办吧?

澳门黄冠娱乐备用网址 34

本来,那样造成是没难点的,只要您愿意。能够这么多或许的判断有未有痛感那个SB?是的,大家本来有更加好的施工方案。固然OrderBy可以一贯传字符串???

消灭净尽方案:

  1. guget下载System.Linq.Dynamic 
  2. 导入System.Linq.Dynamic命名空间
  3. 编纂OrderBy的强盛方法

澳门黄冠娱乐备用网址 35

接下来上面又长又臭的代码能够写成:

澳门黄冠娱乐备用网址 36

咱俩看下生成的sql:

澳门黄冠娱乐备用网址 37

和大家想要的效用完全相符,是还是不是深感美美哒!!

【注意】:流传的排序字段前边要加排序关键字
asc或desc

lamdba条件构成

须求:依照分化境况询问,大概意况

  1. 询问name=“张三” 的有着学员
  2. 询问name=“张三” 只怕 age=18的具备学员

实今世码:

澳门黄冠娱乐备用网址 38

是或不是味到了相似的恶臭澳门黄冠娱乐备用网址 39。下边咱们来灵活组装Lamdba条件。

化解方案:

澳门黄冠娱乐备用网址 40澳门黄冠娱乐备用网址 41

这段代码笔者也是从网络偷的,具体链接找不到了。

下一场咱们的代码能够写成:

澳门黄冠娱乐备用网址 42

有未有美美哒一点澳门黄冠娱乐备用网址 43。然后大家看看生成的sql是还是不是科学:

澳门黄冠娱乐备用网址 44

EF的预热

http://www.cnblogs.com/dudu/p/entity-framework-warm-up.html

count(*)被您用坏了吗(Any的用法卡塔 尔(阿拉伯语:قطر‎

必要:查询是或不是留存名称为“张三”的学子。(你的代码会如何写啊?卡塔尔

澳门黄冠娱乐备用网址 45

率先种?第三种?第二种?呵呵,作者早先就是应用的第风姿浪漫种,然后有些许人会说“你count被你用坏了”,后来本身想了想了怎么就被笔者用坏了呢?直到比较了那三个语句的习性后自个儿清楚了。

澳门黄冠娱乐备用网址 46

品质之差竟有七百多倍,count确实被本身用坏了。(作者想,不独有被作者壹人用坏了啊。卡塔尔国

作者们看出上边的Any干嘛的?官方表明是:

澳门黄冠娱乐备用网址 47

本身每每阅读这些中文演讲,从来无法领会。以致早有人也提议过千篇豆蔻梢头律的难题《实际看不懂MSDN关于
Any
的分解

据此自个儿个人知道也是“鲜明会集中是或不是有成分满足某生机勃勃标准”。我们来探访any其余用法:

渴求:查询教过“张三”或“李四”的良师

落到实处代码:

澳门黄冠娱乐备用网址 48

二种办法,早前笔者会习贯写第大器晚成种。当然大家看看生成过的sql和履行成效之后,观念改造了。

澳门黄冠娱乐备用网址 49

频率之差竟有近六倍

咱俩再对照下count:

澳门黄冠娱乐备用网址 50

澳门黄冠娱乐备用网址 51

得出奇怪的定论:

  1. 在导航属性之中使用count和行使any质量分别相当的小,反而FirstOrDefault()
    != null的方式质量最差。
  2. 在直接属性判定当中any和FirstOrDefault() !=
    null质量分别相当的小,count品质要差的多。
  3. 之所以,不管是一贯属性依旧导航属性大家都用any来剖断是还是不是留存是最安妥的。

晶莹剔透标记符

假若由于各样缘由大家必要写下边那样逻辑的说话

澳门黄冠娱乐备用网址 52

笔者们得以写成这么越来越好

澳门黄冠娱乐备用网址 53

看生成的sql就清楚了

澳门黄冠娱乐备用网址 54

其次种方法变通的sql要干净得多,质量也更加好。

EntityFramework.Extended

此间推荐下插件EntityFramework.Extended,看了下,很精确。

最大的独特之处就是足以向来批量改革、删除,不用像EF默许的急需先做询问操作。

有关官方EF为啥未有提供这么的支撑就不亮堂了。然而使用EntityFramework.Extended须要小心以下几点:

  1. 只支持sql server
  2. 批量改变、删除时不能够落到实处职业(约等于出了很无法回滚卡塔尔
  3. 从没联级删除
  4. 不能同EF一起SaveChanges
    详见

http://www.cnblogs.com/GuZhenYin/p/5482288.html

在这里修改个难点EntityFramework.Extended实际不是说不能够回滚,谢谢@GuZhenYin园友的指正(原谅自个儿前面从未入手测验卡塔 尔(阿拉伯语:قطر‎。

潜心:需求NuGet下载EntityFramework.Extended,
并导入命名空间: using
EntityFramework.Extensions ;

测量试验代码如下:(要是注释掉手抛相当代码是能够直接更新到数据库的卡塔尔国

using (var ctxTransaction = db.Database.BeginTransaction())
{
    try
    {
        db.Teachers.Where(t => true).Update(t => new Teacher { Age = "1" });

        throw new Exception("手动抛出异常");

        ctxTransaction.Commit();//提交事务
    }
    catch (Exception)
    {
        ctxTransaction.Rollback();//回滚事务
    }
}

自定义IQueryable扩张方法

 最终收拾下自定义的IQueryable的扩展。

 澳门黄冠娱乐备用网址 55

澳门黄冠娱乐备用网址 56

 

补充1:

First和Single的区别:前者是TOP(1)后者是TOP(2),后者如果查询到了2条数据则抛出异常。所以在必要的时候使用Single也不会比First慢多少。

补充2: 

已打包nuget提供直接设置 Install-Package
Talk.Linq.Extensions 或nuget寻觅 Talk.Linq.Extensions 

https://github.com/zhaopeiym/Talk/wiki/Talk.Linq.Extensions_demo

 

结束:

源码下载:http://pan.baidu.com/s/1o8MYozw

本文以联合至《C#底蕴知识巩固连串

应接热心园友补充!

相关文章