暗许使用的EF6.0版本

推荐MiniProfiler插件

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

大家使用EF和在比非常大程度升高了支出进程,可是随着带来的是无数属性低下的写法和浮动不太高速的sql。

固然大家能够选择SQL Server
Profiler来监察和控制实行的sql,然而个人感觉正是麻烦,每回须要打开、过滤、清除、关闭。

在这里刚强推荐多少个插件MiniProfiler。实时监察页面央求对应执行的sql语句、试行时间。简单、方便、针对性强。

如图:(实际使用和介绍请移步)

图片 1

属性进步之AsNoTracking

图片 2

大家看变化的sql

图片 3

sql是生成的一模二样,然而进行时间却是4.8倍。原因仅仅只是第一条EF语句多加了多少个AsNoTracking。

注意:

  • AsNoTracking干什么的啊?无跟踪查询而已,也正是说查询出来的靶子不可能直接做修改。所以,我们在做多少集结查询展现,而又没有须求对聚集修改并更新到数据库的时候,一定不要遗忘加上AsNoTracking。
  • 只要查询进度做了select映射就无需加AsNoTracking。如:db.Students.Where(t=>t.Name.Contains(“张三”)).select(t=>new
    (t.Name,t.Age)).ToList();

数量筹划

新建实体:Score(成绩分数表)、Student(学生表)、Teacher(老师表)

图片 4

末端会给出demo代码下载链接

推荐MiniProfiler插件

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

咱俩应用EF和在异常的大程度升高了支出进程,可是随后带动的是过多性质低下的写法和扭转不太高速的sql。

虽说大家得以行使SQL Server
Profiler来监察和控制实施的sql,可是个人以为正是麻烦,每一趟要求开荒、过滤、清除、关闭。

在此处刚烈推荐二个插件MiniProfiler。实时监督页面央求对应进行的sql语句、施行时间。轻巧、方便、针对性强。

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

图片 5

联表查询总结

务求:查询前玖拾陆个学生考试项目(“模拟考试”、“正式考试”)、考试次数、语文平均分、学生姓名,且考试次数抢先等于3次。(按考试体系分类总结)

代码如下:

图片 6

看见这么的代码,小编先是反馈是惨了。又在循环实践sql了。监察和控制如下:

图片 7

实则,大家只必要有些改换就把101条sql形成1条,如下:

图片 8

马上变1条。

图片 9

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

图片 10

发觉那仅仅只是查询结果会集而已,此中的按考试种类来总括是程序得到具有数据后在计算的(实际不是在数据库内总结,然后直接再次回到结果),那样平等是萧疏了数据库查询数据传输。

关于连接查询分组总结大家得以应用SelectMany,如下:

图片 11

督察sql如下:(是不是精简多了呢?)

图片 12

关于SelectMany资料:

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

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

数据图谋

新建实体:Score(战表分数表)、Student(学生表)、Teacher(老师表)

图片 13

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

lamdba条件构成

供给:遵照不相同境况询问,恐怕景况

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

兑当代码:

图片 14

是或不是味到了一模二样的恶臭图片 15。上面大家来灵活组装Lamdba条件。

缓和方案:

图片 16图片 17

这段代码小编也是从英特网偷的,具体链接找不到了。

然后大家的代码能够写成:

图片 18

有未有美美哒一点图片 19。然后我们看看生成的sql是或不是准确:

图片 20

联表查询总括

务求:查询前九19个学生考试体系(“模拟考试”、“正式考试”)、考试次数、语文平均分、学生姓名,且考试次数超越等于3次。(按考试项目分类总计)

代码如下:

图片 21

来看那样的代码,小编先是反馈是惨了。又在循环实施sql了。监察和控制如下:

图片 22

实际上,大家只需求多少退换就把101条sql造成1条,如下:

图片 23

马上变1条。

图片 24

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

图片 25

察觉那仅仅只是查询结果集合而已,个中的按考试项目来总计是程序获得具备数据后在总结的(并不是在数据库内计算,然后径直回到结果),这样同样是浪费了数据库查询数据传输。

关于连接查询分组总结大家可以行使SelectMany,如下:

图片 26

监理sql如下:(是或不是简单多了吗?)

图片 27

关于SelectMany资料:

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

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

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();//回滚事务
    }
}

小心:以下内容若无特意表达,私下认可使用的EF6.0版本,code first格局。

透明标志符

一旦由于种种原因大家要求写上边那样逻辑的口舌

图片 28

咱俩得以写成这样更加好

图片 29

看生成的sql就精晓了

图片 30

第二种方法变通的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();//回滚事务
    }
}

【转】你必得精晓的EF知识和经验

自定义IQueryable扩张方法

 最终整理下自定义的IQueryable的恢弘。

 图片 31

图片 32

 

补充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#基础知识巩固体系

接待热心园友补充!

自定义IQueryable扩张方法

 最终整理下自定义的IQueryable的恢弘。

 图片 33

图片 34

 

补充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#基础知识巩固体系

接待热心园友补充!

质量提高之AsNonUnicode

图片 35

监察和控制到的sql

图片 36

大家看看EF正常景况变化的sql会在前方带上“N”,假若我们增添DbFunctions.AsNonUnicode生成的sql是从未“N”的,当你意识带上“N”的sql比未有带“N”的
sql查询速度慢比非常多的时候那就领会该怎么做。

(从前用oracle的时候带不带“N”查询效用差异特别醒目,今日用sql
server测量检验并不曾察觉什么差别图片 37。还会有笔者意识EF6会依据数据库中是nvarchar的时候才会生成带“N”的sql,oracle数据库没测量检验,有意思味的同校能够测量检验下)

多字段组合排序(字符串)

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

图片 38

图片 39

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

图片 40

图片 41

不错不错,就是大家想要的效能。假使您不想用ThenBy,且都以升序的话,大家也足以:

图片 42

图片 43

变迁的sql是一致的。与OrderBy、ThenBy对应的降序有OrderByDescending、ThenByDescending。

恍如好像很完美了。其实不然,大家一大半地方排序是动态的。比方,大家会进一步前端页面差别的操作须要差别字段的比不上排序。那我们后台应该如何做吧?

图片 44

本来,那样成功是没难题的,只要您愿意。可以这么多只怕的论断有未有痛感非常SB?是的,咱们当然有越来越好的技术方案。要是OrderBy可以直接传字符串???

建设方案:

  1. guget下载System.Linq.Dynamic 
  2. 导入System.Linq.Dynamic命名空间
  3. 编写OrderBy的恢弘方法

图片 45

下一场上边又长又臭的代码能够写成:

图片 46

大家看下生成的sql:

图片 47

和大家想要的功用完全切合,是或不是感觉美美哒!!

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

foreach循环的陷进 

1.关于推迟加载

图片 48

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

图片 49

2.关于在循环中访谈导航属性的丰裕管理(接着上边,加上virtual后会报以下卓殊)

“已有张开的与此 Command 相关联的
DataReader,必需首先将它倒闭。”

图片 50

消除方案:

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

3.以上两点仅为热身,大家说的骗局才刚刚起首!

图片 51

下一场大家点击张开MiniProfiler工具(不要被吓到)

图片 52

图片 53

设计方案:使用Include显示接二连三查询(注意:要求手动导入using System.Data.Entity
不然Include只可以传表名字符串)。

图片 54

再看MiniProfiler的督察(须臾间101条sql产生了1条,那其间的质量综上可得。)

图片 55

count(*)被你用坏了啊(Any的用法)

渴求:查询是或不是存在名称为“张三”的上学的小孩子。(你的代码会什么写吗?)

图片 56

首先种?第两种?第二种?呵呵,笔者原先便是使用的首先种,然后有的人讲“你count被你用坏了”,后来笔者想了想了怎么就被笔者用坏了吗?直到相比较了那八个语句的性质后笔者精通了。

图片 57

属性之差竟有三百多倍,count确实被自身用坏了。(小编想,不仅被小编一个人用坏了呢。)

大家见到下面的Any干嘛的?官方表明是:

图片 58

自己频仍阅读这一个中文阐述,一贯不能够知晓。以致早有人也提议过同样的疑问《实际上看不懂MSDN关于
Any
的演讲

故此作者个人了然也是“明确集结中是还是不是有成分满意某一法规”。我们来拜见any别的用法:

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

兑当代码:

图片 59

三种艺术,之前作者会习于旧贯写第一种。当然大家看看生成过的sql和实践效能之后,理念退换了。

图片 60

频率之差竟有近六倍

大家再对照下count:

图片 61

图片 62

得出离奇的结论:

  1. 在导航属性之中使用count和行使any质量分别相当的小,反而FirstOrDefault()
    != null的议程质量最差。
  2. 在直接属性判别个中any和FirstOrDefault() !=
    null品质分别十分小,count质量要差的多。
  3. 故而,不管是一向属性依旧导航属性我们都用any来推断是或不是存在是最安妥的。

EF的预热

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

本性升高之AsNoTracking

图片 63

小编们看变化的sql

图片 64

sql是调换的大同小异,不过实践时间却是4.8倍。原因仅仅只是第一条EF语句多加了一个AsNoTracking。

注意:

  • AsNoTracking干什么的吗?无追踪查询而已,约等于说查询出来的靶子无法直接做修改。所以,大家在做多少集结查询呈现,而又不须求对集中修改并更新到数据库的时候,一定不要遗忘加上AsNoTracking。
  • 一旦查询进度做了select映射就无需加AsNoTracking。如:db.Students.Where(t=>t.Name.Contains(“张三”)).select(t=>new
    (t.Name,t.Age)).ToList();

透明标记符

设若由于各样原因大家要求写上边那样逻辑的言辞

图片 65

咱俩得以写成那样更好

图片 66

看生成的sql就精晓了

图片 67

第三种方法调换的sql要干净得多,质量也更加好。

EF的预热

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

AutoMapper工具

地点我们经过Include呈现的试行表的接连查询明显是不利的,但还非常不够。假设我们只要求查询数据的少数字段呢,上边查询全体字段岂不是很浪费内部存款和储蓄器存储空间和应用程序与数据库数据传输带宽。

大家能够:

图片 68

对应监督到的sql:

图片 69

咱们见到变化的sql,查询的字段少了重重。独有我们突显列出来字段的和三个StudentId,StudentId用来连接查询条件的。

科学,那样的点子很科学。可是有未有哪些越来越好的方案或方式吗?答案是不容置疑的。(不然,也不会在这里屁话了。)倘诺表字段相当多,大家需求使用的字段也要命多,导航属性也不行多的时候,那样的手动映射就呈现不那么赏心悦目了。那么接下去大家初叶介绍使用AutoMapper来完成映射:

静心:首先须求NuGet下载AutoMapper。(然后导入命名空间 using
AutoMapper; using AutoMapper.QueryableExtensions;)

图片 70

图片 71

大家看见地点查询语句未有一个个的手动映射,而映射都以独立布置了。在那之中CreateMap应该是要写到Global.asax文件之中的。(其实也正是分别了酷炫部分,清晰了询问语句。留心的同窗大概注意到了,这种办法还免去了主动Include)

图片 72

咱俩来看了变化的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

AutoMapper工具

上边大家通过Include呈现的施行表的连年查询分明是无可置疑的,但还缺乏。纵然大家只须求查询数据的某个字段呢,上边查询全体字段岂不是很浪费内部存款和储蓄器存款和储蓄空间和应用程序与数据库数据传输带宽。

咱俩得以:

图片 73

对应监督到的sql:

图片 74

大家看出变化的sql,查询的字段少了无数。仅有大家来得列出来字段的和一个StudentId,StudentId用来连接查询条件的。

是的,那样的法子特别不错。可是有未有啥越来越好的方案或艺术吧?答案是必然的。(不然,也不会在此处屁话了。)假使表字段比非常多,大家需求接纳的字段也相当多,导航属性也非常的多的时候,那样的手动映射就显得不那么赏心悦目了。那么接下去大家开头介绍使用AutoMapper来达成映射:

注意:首先须求NuGet下载AutoMapper。(然后导入命名空间 using
AutoMapper; using AutoMapper.QueryableExtensions;)

图片 75

图片 76

小编们看看地方查询语句未有一个个的手动映射,而映射都以独自安插了。在这之中CreateMap应该是要写到Global.asax文件之中的。(其实也正是分离了炫人眼目部分,清晰了查询语句。细心的同校恐怕注意到了,这种格局还免去了积极Include)

图片 77

大家看出了改动的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

多字段组合排序(字符串)

渴求:查询名字里面包含“张三”的学习者,先按名字排序,再按年龄排序。

图片 78

图片 79

哎,不对啊。按名字排序被年龄排序覆盖了。大家应当用ThenBy来组合排序。

图片 80

图片 81

不错不错,就是大家想要的成效。要是你不想用ThenBy,且都以升序的话,大家也能够:

图片 82

图片 83

转移的sql是同样的。与OrderBy、ThenBy对应的降序有OrderByDescending、ThenByDescending。

恍如好像很完美了。其实不然,我们大部分景色排序是动态的。比方,大家会尤其前端页面差异的操作要求不相同字段的两样排序。那大家后台应该怎么办吗?

图片 84

当然,那样成功是没难点的,只要您愿意。能够如此多大概的论断有未有痛感极其SB?是的,大家当然有更加好的化解方案。假使OrderBy能够直接传字符串???

缓和方案:

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

图片 85

下一场上边又长又臭的代码能够写成:

图片 86

咱俩看下生成的sql:

图片 87

和大家想要的功效完全符合,是或不是感到美美哒!!

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

留心:以下内容若无特意表达,私下认可使用的EF6.0版本,code first方式。

lamdba条件构成

务求:依照区别景况询问,也许意况

  1. 查询name=“张三” 的有着学员
  2. 询问name=“张三” 或许 age=18的具有学生

福寿绵绵代码:

图片 88

是或不是味到了平等的臭味图片 89。上面大家来灵活组装Lamdba条件。

施工方案:

图片 90图片 91

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

接下来大家的代码能够写成:

图片 92

有未有美美哒一点图片 93。然后我们看看生成的sql是还是不是科学:

图片 94

foreach循环的陷进 

1.关于推迟加载

图片 95

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

图片 96

2.关于在循环中拜会导航属性的十二分管理(接着上边,加上virtual后会报以下非常)

“已有张开的与此 Command 相关联的
DataReader,必得首先将它破产。”

图片 97

化解方案:

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

3.上述两点仅为热身,我们说的骗局才刚刚早先!

图片 98

然后我们点击打开MiniProfiler工具(不要被吓到)

图片 99

图片 100

施工方案:使用Include来得三翻五次查询(注意:供给手动导入using System.Data.Entity
否则Include只可以传表名字符串)。

图片 101

再看MiniProfiler的监察和控制(瞬间101条sql造成了1条,那当中的特性由此可见。)

图片 102

count(*)被您用坏了啊(Any的用法)

供给:查询是还是不是存在名称为“张三”的学习者。(你的代码会怎么写啊?)

图片 103

首先种?第二种?第三种?呵呵,笔者原先正是选取的率先种,然后有些人说“你count被你用坏了”,后来自己想了想了怎么就被小编用坏了吗?直到相比了那四个语句的质量后作者精晓了。

图片 104

质量之差竟有三百多倍,count确实被本人用坏了。(作者想,不仅被作者一个人用坏了吧。)

大家看来上边的Any干嘛的?官方表达是:

图片 105

本身数次阅读这一个普通话阐述,一贯不也许清楚。以致早有人也建议过同样的疑团《其实看不懂MSDN关于
Any
的讲明

据此笔者个人明白也是“分明群集中是还是不是有成分满意某一原则”。大家来造访any别的用法:

务求:查询教过“张三”或“李四”的民间兴办教授

金玉锦绣代码:

图片 106

二种艺术,从前笔者会习于旧贯写第一种。当然我们看看生成过的sql和实行功效之后,思想改动了。

图片 107

频率之差竟有近六倍

我们再对照下count:

图片 108

图片 109

得出奇异的定论:

  1. 在导航属性之中使用count和应用any品质分别不大,反而FirstOrDefault()
    != null的不二等秘书技品质最差。
  2. 在直接属性判定个中any和FirstOrDefault() !=
    null品质分别一点都不大,count品质要差的多。
  3. 据此,不管是一直属性依旧导航属性我们都用any来剖断是不是存在是最稳当的。

属性进步之AsNonUnicode

图片 110

监察和控制到的sql

图片 111

笔者们看来EF符合规律情形变化的sql会在前方带上“N”,尽管大家抬高DbFunctions.AsNonUnicode生成的sql是未有“N”的,当您发掘带上“N”的sql比尚未带“N”的
sql查询速度慢相当多的时候那就掌握该如何做。

(从前用oracle的时候带不带“N”查询效用差距特别引人注目,前天用sql
server测量试验并从未察觉什么样差距图片 112。还应该有自个儿发觉EF6会依据数据库中是nvarchar的时候才会生成带“N”的sql,oracle数据库没测量试验,有意思味的同桌能够测量试验下)