暗许使用的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后会报以下非凡卡塔尔

“本来就有开辟的与此 Command 相关联的
DataReader,必得首先将它破产。”

图片 5

寸草不留方案:

  • 方案1、设定ConnectionString加上MultipleActiveResultSets=true,但只适用于SQL
    二〇〇五自此的版本
  • 方案2、也许先读出放置在List中

3.以上两点仅为热身,我们说的骗局才刚刚初始!

图片 6

下一场大家点击展开MiniProfiler工具(不要被吓到卡塔 尔(英语:State of Qatar)

图片 7

图片 8

解决方案:使用Include来得接二连三查询(注意:必要手动导入using System.Data.Entity
不然Include只好传表名字符串卡塔尔国。

图片 9

再看MiniProfiler的监察(弹指间101条sql产生了1条,这么些中的性质总的来说。卡塔 尔(英语:State of Qatar)

图片 10

AutoMapper工具

上边大家透过Include展现的实施表的连接查询显著是情有可原的,但还相当不够。假若我们只须求查询数据的有些字段呢,上面查询全部字段岂不是很浪费内部存款和储蓄器存款和储蓄空间和应用程序与数据库数据传输带宽。

咱俩得以:

图片 11

对应监督到的sql:

图片 12

大家看来变化的sql,查询的字段少了成百上千。独有大家体现列出来字段的和叁个StudentId,StudentId用来三番五次查询条件的。

不错,那样的艺术很正确。不过有未有怎样越来越好的方案或艺术吧?答案是放任自流的。(不然,也不会在那屁话了。卡塔尔国假设表字段超多,我们供给运用的字段也超多,导航属性也相当多的时候,那样的手动映射就显示不那么窘迫了。那么接下去咱们初始介绍使用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

联表查询总结

渴求:查询前九14个学子考试项目(“模拟考试”、“正式考试”卡塔 尔(阿拉伯语:قطر‎、考试次数、语文平均分、学子姓名,且考试次数超越等于3次。(按考试项目分类总计卡塔 尔(英语:State of Qatar)

代码如下:

图片 16

来看那般的代码,笔者先是反应是惨了。又在循环推行sql了。监察和控制如下:

图片 17

骨子里,大家只要求多少退换就把101条sql形成1条,如下:

图片 18

马上变1条。

图片 19

我们开垦查看详细的sql语句

图片 20

察觉那仅仅只是查询结果集结而已,当中的按考试种类来总括是前后相继得到全部数据后在测算的(并非在数据库内计算,然后直接重返结果卡塔尔,那样平等是抛荒了数据库查询数据传输。

关于连接查询分组总计我们得以选取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。

好像好像很康健了。其实不然,大家超越58%情景排序是动态的。比如,我们会进一层前端页面差别的操作须要不一样字段的差异排序。那我们后台应该如何做吧?

图片 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的用法卡塔 尔(英语:State of Qatar)

必要:查询是或不是留存名为“张三”的上学的小孩子。(你的代码会什么写吧?卡塔尔

图片 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园友的指正(原谅笔者前边从未入手测量试验卡塔 尔(英语:State of Qatar)。

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

测验代码如下:(假若注释掉手抛分外代码是足以平素更新到数据库的卡塔 尔(英语:State of Qatar)

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#底蕴知识加强种类

接待热心园友补充!

相关文章