暗中同意使用的EF陆.0版本

【转】你必须清楚的EF知识和阅历

只顾:以下内容如若未有特意表明,暗中认可使用的EF陆.0版本,code first方式。

小心:以下内容倘若未有特意表明,暗许使用的EF6.0版本,codefirst方式。

只顾:以下内容如若未有非常表达,暗中认可使用的EF6.0版本,code first方式。

推荐MiniProfiler插件

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

我们应用EF和在一点都不小程度提升了支出速度,不过随后推动的是无数属性低下的写法和扭转不太高速的sql。

就算如此大家得以采取SQL Server
Profiler来监察和控制施行的sql,可是个人以为就是麻烦,每一回需求开荒、过滤、清除、关闭。

在此地刚强推荐1个插件MiniProfiler。实时监察页面请求对应试行的sql语句、实施时间。简单、方便、针对性强。

如图:(切实采取和介绍请移步)

公海赌船网址 1

推荐MiniProfiler插件

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

我们运用EF和在非常的大程度升高了开支速度,可是随着带来的是多多益善质量低下的写法和变化不太高速的sql。

固然如此我们能够使用SQL Server
Profiler来监察和控制实践的sql,然而个人以为便是麻烦,每一趟必要开拓、过滤、清除、关闭。

在此间生硬推荐1个插件MiniProfiler。实时监察和控制页面请求对应施行的sql语句、实行时间。轻易、方便、针对性强。

如图:(具体运用和介绍请移步)

公海赌船网址 2

推荐MiniProfiler插件

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

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

虽说我们得以行使SQL Server
Profiler来监察和控制实行的sql,可是个人认为正是麻烦,每一回须要开发、过滤、清除、关闭。

在此处刚毅推荐一个插件MiniProfiler。实时监督页面请求对应奉行的sql语句、施行时间。轻松、方便、针对性强。

如图:(具体行使和介绍请移步)

公海赌船网址 3

数量希图

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

公海赌船网址 4

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

数据筹算

新建实体:Score、Student、Teacher

公海赌船网址 5

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

数码策画

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

公海赌船网址 6

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

foreach循环的陷进 

1.有关推迟加载

公海赌船网址 7

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

公海赌船网址 8

2.有关在循环中访问导航属性的百般管理(接着上面,加上virtual后会报以下非凡)

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

公海赌船网址 9

涸泽而渔方案:

  • 方案1、设定ConnectionString加上MultipleActiveResultSets=true,但只适用于SQL
    二零零七将来的本子
  • 方案二、可能先读出放置在List中

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

公海赌船网址 10

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

公海赌船网址 11

公海赌船网址 12

缓慢解决方案:使用Include体现两次三番查询(注意:要求手动导入using System.Data.Entity
不然Include只能传表名字符串)。

公海赌船网址 13

再看MiniProfiler的监察(弹指间101条sql产生了一条,这之中的质量由此可见。)

公海赌船网址 14

foreach循环的陷进

一.关于延迟加载

公海赌船网址 15

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

公海赌船网址 16

二.有关在循环中做客导航属性的不胜管理(接着上面,加上virtual后会报以下极度)

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

公海赌船网址 17

解决方案:

  • 方案一、设定ConnectionString加上MultipleActiveResultSets=true,但只适用于SQL
    2005之后的版本
  • 方案贰、可能先读出放置在List中

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

公海赌船网址 18

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

公海赌船网址 19

公海赌船网址 20

消除方案:使用Include展示三番五次查询(注意:须求手动导入using System.Data.Entity
不然Include只可以传表名字符串)。

公海赌船网址 21

再看MiniProfiler的监督检查(瞬间十一条sql产生了一条,那当中的性质综上可得。)

公海赌船网址 22

foreach循环的陷进 

一.有关推迟加载

公海赌船网址 23

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

公海赌船网址 24

二.有关在循环中走访导航属性的非常处理(接着上边,加上virtual后会报以下万分)

“已有开采的与此 Command 相关联的
DataReader,必须首先将它停业。”

公海赌船网址 25

缓慢解决方案:

  • 方案1、设定ConnectionString加上MultipleActiveResultSets=true,但只适用于SQL
    2005随后的本子
  • 方案2、大概先读出放置在List中

叁.之上两点仅为热身,大家说的圈套才刚刚起头!

公海赌船网址 26

接下来我们点击张开MiniProfiler工具(不要被吓到)

公海赌船网址 27

公海赌船网址 28

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

公海赌船网址 29

再看MiniProfiler的督察(弹指间101条sql形成了一条,这其间的习性总之。)

公海赌船网址 30

AutoMapper工具

地点我们经过Include呈现的推行表的连续查询鲜明是情有可原的,但还不够。倘若我们只必要查询数据的某个字段呢,上边查询全体字段岂不是很浪费内部存款和储蓄器存款和储蓄空间和应用程序与数据库数据传输带宽。

咱俩能够:

公海赌船网址 31

对应监督到的sql:

公海赌船网址 32

我们见到变化的sql,查询的字段少了重重。只有我们来得列出来字段的和二个StudentId,StudentId用来延续查询条件的。

科学,那样的法子很不错。但是有未有怎么样更加好的方案或艺术吧?答案是毫无疑问的。(不然,也不会在此地屁话了。)假如表字段极其多,我们供给使用的字段也万分多,导航属性也格外多的时候,那样的手动映射就展示不那么赏心悦目了。那么接下去大家初步介绍使用AutoMapper来成功映射:

只顾:首先需求NuGet下载AutoMapper。(然后导入命名空间 using
AutoMapper; using AutoMapper.QueryableExtensions;)

公海赌船网址 33

公海赌船网址 34

作者们看出上边查询语句未有二个个的手动映射,而映射都以单身安插了。其中CreateMap应该是要写到Global.asax文件之中的。(其实也正是分离了炫彩部分,清晰了询问语句。细心的同窗或然注意到了,这种措施还免去了当仁不让Include)

公海赌船网址 35

咱俩看看了变化的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呈现的实践表的连天查询鲜明是科学的,但还不够。假若大家只须求查询数据的一些字段呢,上边查询全数字段岂不是很浪费内部存款和储蓄器存款和储蓄空间和应用程序与数据库数据传输带宽。

大家能够:

公海赌船网址 36

对应监督到的sql:

公海赌船网址 37

我们来看变化的sql,查询的字段少了很多。只有大家显示列出来字段的和三个StudentId,StudentId用来延续查询条件的。

科学,那样的点子很不利。不过有没有如何更加好的方案或措施呢?答案是必然的。(不然,也不会在此处屁话了。)如果表字段极度多,大家必要运用的字段也丰裕多,导航属性也要命多的时候,那样的手动映射就显示不那么赏心悦目了。那么接下去我们起先介绍使用AutoMapper来产生映射:

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

公海赌船网址 38

公海赌船网址 39

咱俩来看地方查询语句没有一个个的手动映射,而映射都以单独布署了。个中CreateMap应该是要写到Global.asax文件之中的。(其实也正是分别了炫目部分,清晰了询问语句。细心的同室只怕注意到了,这种方法还免去了主动Include)

公海赌船网址 40

我们看看了变动的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展现的推行表的连日查询明显是没有错的,但还不够。假若我们只供给查询数据的一些字段呢,下边查询全体字段岂不是很浪费内部存款和储蓄器存款和储蓄空间和应用程序与数据库数据传输带宽。

咱俩得以:

公海赌船网址 41

对应监督到的sql:

公海赌船网址 42

大家看来变化的sql,查询的字段少了大多。唯有大家浮现列出来字段的和3个StudentId,StudentId用来连接查询条件的。

精确,那样的艺术很精确。然则有未有何样越来越好的方案或措施吧?答案是必定的。(不然,也不会在这边屁话了。)如若表字段特别多,大家要求动用的字段也非常多,导航属性也卓殊多的时候,那样的手动映射就体现不那么美观了。那么接下去大家初阶介绍使用AutoMapper来成功映射:

只顾:首先要求NuGet下载AutoMapper。(然后导入命名空间 using
AutoMapper; using AutoMapper.QueryableExtensions;)

公海赌船网址 43

公海赌船网址 44

大家看看上面查询语句未有三个个的手动映射,而映射都是单身布署了。个中CreateMap应该是要写到Global.asax文件之中的。(其实也正是分别了炫目部分,清晰了询问语句。细心的校友可能注意到了,这种方法还免去了主动Include)

公海赌船网址 45

咱俩看到了调换的sql和前面有稍许不1,但只生成了一条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

联表查询总计

渴求:查询前九十八个学生考试项目(“模拟考试”、“正式考试”)、考试次数、语文平均分、学生姓名,且考试次数抢先等于三次。(按考试连串分类总结)

代码如下:

公海赌船网址 46

见到这么的代码,作者第壹反馈是惨了。又在循环推行sql了。监察和控制如下:

公海赌船网址 47

实质上,大家只须要多少改换就把拾壹条sql产生一条,如下:

公海赌船网址 48

马上变1条。

公海赌船网址 49

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

公海赌船网址 50

发觉那仅仅只是查询结果集结而已,在那之中的按考试类别来总括是程序获得具有数据后在总计的(而不是在数据库内总计,然后间接重返结果),那样平等是荒废了数据库查询数据传输。

至于连接查询分组总括大家得以行使SelectMany,如下:

公海赌船网址 51

督察sql如下:(是或不是轻松多了吗?)

公海赌船网址 52

关于SelectMany资料:

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

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

联表查询总括

务求:查询前九二十个学生考试连串(“模拟考试”、“正式考试”)、考试次数、语文平均分、学生姓名,且考试次数超过等于三遍。(按考试项目分类总括)

代码如下:

公海赌船网址 53

看到如此的代码,作者先是影响是惨了。又在循环施行sql了。监察和控制如下:

公海赌船网址 54

实在,我们只须要某些改动就把拾1条sql形成一条,如下:

公海赌船网址 55

马上变1条。

公海赌船网址 56

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

公海赌船网址 57

发觉那仅仅只是查询结果集合而已,其中的按考试类别来计算是先后得到具有数据后在图谋的(而不是在数据库内计算,然后径直回到结果),这样平等是荒废了数据库查询数据传输。

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

公海赌船网址 58

监督检查sql如下:(是还是不是轻便多了呢?)

公海赌船网址 59

关于SelectMany资料:

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

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

联表查询计算

渴求:查询前一百个学生考试体系(“模拟考试”、“正式考试”)、考试次数、语文平均分、学生姓名,且考试次数超过等于3遍。(按考试连串分类总括)

代码如下:

公海赌船网址 60

探望那般的代码,我第叁反馈是惨了。又在循环推行sql了。监察和控制如下:

公海赌船网址 61

事实上,大家只需求有个别改动就把拾一条sql变成一条,如下:

公海赌船网址 62

马上变1条。

公海赌船网址 63

咱俩打开查看详细的sql语句

公海赌船网址 64

意识那仅仅只是查询结果集合而已,其中的按考试种类来计算是先后拿到独具数据后在测算的(而不是在数据库内总计,然后直接回到结果),那样平等是荒废了数据库查询数据传输。

有关连接查询分组计算大家得以选取SelectMany,如下:

公海赌船网址 65

监理sql如下:(是否轻易多了啊?)

公海赌船网址 66

关于SelectMany资料:

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

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

属性进步之AsNonUnicode

公海赌船网址 67

监督检查到的sql

公海赌船网址 68

我们看来EF平常境况变化的sql会在后面带上“N”,假若大家抬高DbFunctions.AsNonUnicode生成的sql是从未有过“N”的,当您开掘带上“N”的sql比尚未带“N”的
sql查询速度慢大多的时候那就知晓该咋办。

(从前用oracle的时候带不带“N”查询效能差异非常醒目,今日用sql
server测试并从未察觉什么样差异公海赌船网址 69。还有自身发觉EF陆会依据数据库中是nvarchar的时候才会生成带“N”的sql,oracle数据库没测试,有乐趣的同班能够测试下)

属性进步之AsNonUnicode

公海赌船网址 70

监理到的sql

公海赌船网址 71

小编们看来EF符合规律情形变化的sql会在头里带上“N”,如若大家增添DbFunctions.AsNonUnicode生成的sql是从未有过“N”的,当你发觉带上“N”的sql比尚未带“N”的
sql查询速度慢许多的时候那就领会该咋做。

(在此在此以前用oracle的时候带不带“N”查询效能差距非常醒目,明天用sql
server测试并不曾意识什么样差距公海赌船网址 72。还有笔者意识EF陆会依据数据库中是nvarchar的时候才会生成带“N”的sql,oracle数据库没测试,风乐趣的同桌能够测试下)

属性升高之AsNonUnicode

公海赌船网址 73

督察到的sql

公海赌船网址 74

大家看到EF平常情形变化的sql会在前面带上“N”,倘诺我们增多DbFunctions.AsNonUnicode生成的sql是从未“N”的,当你发觉带上“N”的sql比尚未带“N”的
sql查询速度慢诸多的时候那就驾驭该如何是好。

(以前用oracle的时候带不带“N”查询功用差雷蛇其了然,今天用sql
server测试并不曾意识什么异样公海赌船网址 75。还有我意识EF6会根据数据库中是nvarchar的时候才会生成带“N”的sql,oracle数据库没测试,有意思味的同学能够测试下)

天性升高之AsNoTracking

公海赌船网址 76

我们看变化的sql

公海赌船网址 77

sql是生成的如出一辙,不过实行时间却是4.8倍。原因仅仅只是第二条EF语句多加了一个AsNoTracking。

注意:

  • AsNoTracking干什么的啊?无追踪查询而已,也正是说查询出来的指标不可能平昔做修改。所以,大家在做多少集合查询呈现,而又无需对聚焦修改并立异到数据库的时候,一定不要遗忘加上AsNoTracking。
  • 假如查询进度做了select映射就无需加AsNoTracking。如:db.Students.Where(t=>t.Name.Contains(“张3”)).select(t=>new
    (t.Name,t.Age)).ToList();

品质进步之AsNoTracking

公海赌船网址 78

咱俩看变化的sql

公海赌船网址 79

sql是调换的大同小异,然则举行时间却是4.8倍。原因仅仅只是第贰条EF语句多加了二个AsNoTracking。

注意:

  • AsNoTracking干什么的吗?无追踪查询而已,也正是说查询出来的对象不可能直接做修改。所以,大家在做多少会集查询显示,而又没有须求对聚集修改并更新到数据库的时候,一定不要遗忘加上AsNoTracking。
  • 一旦查询进程做了select映射就无需加AsNoTracking。如:db.Students.Where(t=>t.Name.Contains.select(t=>new
    (t.Name,t.Age)).ToList();

品质提高之AsNoTracking

公海赌船网址 80

咱俩看变化的sql

公海赌船网址 81

sql是转变的千篇一律,可是施行时间却是4.8倍。原因仅仅只是第一条EF语句多加了2个AsNoTracking。

注意:

  • AsNoTracking干什么的呢?无追踪查询而已,也便是说查询出来的对象无法一直做修改。所以,大家在做多少群集查询显示,而又无需对聚焦修改并立异到数据库的时候,一定不要遗忘加上AsNoTracking。
  • 假如查询进度做了select映射就无需加AsNoTracking。如:db.Students.Where(t=>t.Name.Contains(“张3”)).select(t=>new
    (t.Name,t.Age)).ToList();

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

须要:查询名字里面含有“张3”的上学的小孩子,先按名字排序,再按年龄排序。

公海赌船网址 82

公海赌船网址 83

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

公海赌船网址 84

公海赌船网址 85

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

公海赌船网址 86

公海赌船网址 87

扭转的sql是均等的。与OrderBy、ThenBy对应的降序有OrderByDescending、ThenByDescending。

好像好像很完善了。其实不然,大家大多数情景排序是动态的。比如,大家会越来越前端页面不一致的操作供给分化字段的不等排序。那大家后台应该如何做啊?

公海赌船网址 88

理之当然,那样变成是没难点的,只要你愿意。能够那样多恐怕的剖断有未有感到极度SB?是的,大家本来有越来越好的缓和方案。假设OrderBy能够一向传字符串???

赶尽杀绝方案:

  1. guget下载System.Linq.Dynamic 
  2. 导入System.Linq.Dynamic命名空间
  3. 编写制定OrderBy的扩张方法

公海赌船网址 89

然后上边又长又臭的代码可以写成:

公海赌船网址 90

小编们看下生成的sql:

公海赌船网址 91

和大家想要的效益完全符合,是否感到美美哒!!

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

多字段组合排序

供给:查询名字里面包罗“张三”的学员,先按名字排序,再按年龄排序。

公海赌船网址 92

公海赌船网址 93

嘿,不对啊。按名字排序被年龄排序覆盖了。我们应有用ThenBy来组成排序。

公海赌船网址 94

公海赌船网址 95

不错不错,就是大家想要的意义。借使您不想用ThenBy,且都是升序的话,大家也得以:

公海赌船网址 96

公海赌船网址 97

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

看似好像很周全了。其实不然,大家超越二分之一情形排序是动态的。比方,大家会越加前端页面分化的操作必要分歧字段的不等排序。那我们后台应该如何做呢?

公海赌船网址 98

本来,那样成功是没难题的,只要您愿意。能够那样多也许的剖断有未有感到11分SB?是的,大家自然有更加好的减轻方案。若是OrderBy可以直接传字符串???

消除方案:

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

公海赌船网址 99

然后上边又长又臭的代码能够写成:

公海赌船网址 100

大家看下生成的sql:

公海赌船网址 101

和我们想要的机能完全符合,是还是不是以为美美哒!!

传扬的排序字段前面要加排序关键字
asc或desc

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

须要:查询名字里面包括“张叁”的学生,先按名字排序,再按年龄排序。

公海赌船网址 102

公海赌船网址 103

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

公海赌船网址 104

公海赌船网址 105

不错不错,正是大家想要的功能。假如您不想用ThenBy,且都以升序的话,我们也足以:

公海赌船网址 106

公海赌船网址 107

更换的sql是壹律的。与OrderBy、ThenBy对应的降序有OrderByDescending、ThenByDescending。

好像好像很完善了。其实不然,我们超过四分之二气象排序是动态的。比如,大家会愈发前端页面分裂的操作须求不相同字段的分化排序。那我们后台应该如何做呢?

公海赌船网址 108

自然,那样产生是没难题的,只要你愿意。可以这么多或然的剖断有未有以为分外SB?是的,我们本来有更加好的缓和方案。若是OrderBy能够一向传字符串???

消除方案:

  1. guget下载System.Linq.Dynamic 
  2. 导入System.Linq.Dynamic命名空间
  3. 编辑OrderBy的变得强大方法

公海赌船网址 109

然后上边又长又臭的代码能够写成:

公海赌船网址 110

我们看下生成的sql:

公海赌船网址 111

和大家想要的功效完全符合,是否深感美美哒!!

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

lamdba条件构成

须求:依照不一致景况询问,只怕景况

  1. 查询name=“张叁” 的有着学员
  2. 询问name=“张三” 恐怕 age=1八的具有学生

落到实处代码:

公海赌船网址 112

是否味到了一样的臭味公海赌船网址 113。上面大家来灵活组装Lamdba条件。

化解方案:

公海赌船网址 114公海赌船网址 115

公海赌船网址,这段代码作者也是从英特网偷的,具体链接找不到了。

接下来咱们的代码可以写成:

公海赌船网址 116

有没有美美哒一点公海赌船网址 117。然后大家看看生成的sql是或不是正确:

公海赌船网址 118

lamdba条件构成

渴求:依照区别情状询问,只怕情状

  1. 查询name=“张三” 的保有学员
  2. 询问name=“张叁” 大概 age=1八的享有学生

兑当代码:

公海赌船网址 119

是否味到了千篇壹律的恶臭公海赌船网址 120。上边大家来灵活组装Lamdba条件。

消除方案:

公海赌船网址 121公海赌船网址 122

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

下一场大家的代码能够写成:

公海赌船网址 123

有未有美美哒一点公海赌船网址 124。然后我们看看生成的sql是还是不是科学:

公海赌船网址 125

lamdba条件构成

务求:依据区别景观询问,大概情形

  1. 询问name=“张三” 的具备学生
  2. 查询name=“张叁” 也许 age=1八的有着学员

福寿绵绵代码:

公海赌船网址 126

是还是不是味到了百折不挠的臭味公海赌船网址 127。下边大家来灵活组装Lamdba条件。

赶尽杀绝方案:

公海赌船网址 128公海赌船网址 129

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

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

公海赌船网址 130

有未有美美哒一点公海赌船网址 131。然后大家看看生成的sql是或不是准确:

公海赌船网址 132

EF的预热

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

EF的预热

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

EF的预热

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

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

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

公海赌船网址 133

首先种?第2种?第二种?呵呵,笔者原先正是采纳的首先种,然后有些人讲“你count被你用坏了”,后来自家想了想了怎么就被自个儿用坏了吗?直到比较了那多少个语句的品质后笔者精通了。

公海赌船网址 134

个性之差竟有三百多倍,count确实被本人用坏了。(笔者想,不仅仅被作者壹个人用坏了呢。)

咱俩来看上面的Any干嘛的?官方解释是:

公海赌船网址 135

本人反复阅读那一个普通话表明,平昔不可能了然。以至早有人也提议过同样的疑点《事实上看不懂MSDN关于
Any
的表明

之所以笔者个人明白也是“显明集合中是还是不是有成分满意某壹标准化”。大家来看望any别的用法:

务求:查询教过“张三”或“李四”的园丁

落实代码:

公海赌船网址 136

三种办法,以前笔者会习于旧贯写第二种。当然大家看看生成过的sql和实施功能之后,理念改动了。

公海赌船网址 137

频率之差竟有近六倍

咱俩再对照下count:

公海赌船网址 138

公海赌船网址 139

得出奇异的定论:

  1. 在导航属性之中使用count和使用any品质分别十分的小,反而FirstOrDefault()
    != null的格局质量最差。
  2. 在一直属性推断个中any和FirstOrDefault() !=
    null品质分别相当的小,count质量要差的多。
  3. 于是,不管是向来属性照旧导航属性大家都用any来剖断是或不是留存是最妥帖的。

count被您用坏了啊

渴求:查询是或不是存在名称叫“张三”的学习者。(你的代码会怎样写啊?)

公海赌船网址 140

首先种?第3种?第2种?呵呵,小编原先正是应用的第1种,然后有些人说“你count被你用坏了”,后来本身想了想了怎么就被小编用坏了啊?直到比较了那四个语句的性质后作者驾驭了。

公海赌船网址 141

品质之差竟有三百多倍,count确实被本身用坏了。(小编想,不唯有被本身一人用坏了呢。)

咱俩来看地点的Any干嘛的?官方解释是:

公海赌船网址 142

本人反复阅读这么些中文表明,一向不大概领会。以致早有人也建议过一样的疑问《实在看不懂MSDN关于
Any 的表达》

因此小编个人知道也是“明确集合中是不是有成分满足某1尺码”。大家来看看any其余用法:

渴求:查询教过“张叁”或“李4”的导师

落实代码:

公海赌船网址 143

三种方式,以前小编会习于旧贯写第2种。当然大家看看生成过的sql和试行功效之后,思想改换了。

公海赌船网址 144

频率之差竟有近六倍

我们再对照下count:

公海赌船网址 145

公海赌船网址 146

得出奇异的下结论:

  1. 在导航属性之中使用count和动用any质量分别非常的小,反而FirstOrDefault()
    != null的点子质量最差。
  2. 在一向属性判定个中any和FirstOrDefault() !=
    null质量分别异常的小,count品质要差的多。
  3. 所以,不管是直接属性照旧导航属性大家都用any来推断是不是留存是最妥帖的。

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

务求:查询是不是留存名叫“张三”的学员。(你的代码会怎么样写吧?)

公海赌船网址 147

先是种?第二种?第两种?呵呵,作者在此之前正是利用的率先种,然后有一些人讲“你count被您用坏了”,后来小编想了想了怎么就被自个儿用坏了吧?直到相比了那四个语句的习性后作者晓得了。

公海赌船网址 148

属性之差竟有三百多倍,count确实被自个儿用坏了。(笔者想,不仅被作者一位用坏了吗。)

作者们来看地方的Any干嘛的?官方表明是:

公海赌船网址 149

我频仍阅读那一个汉语表达,平素不能够知晓。乃至早有人也提议过一样的问号《骨子里看不懂MSDN关于
Any
的演说

之所以本人个人知道也是“明显群集中是或不是有成分知足某一尺码”。我们来探望any其余用法:

渴求:查询教过“张叁”或“李肆”的名师

兑今世码:

公海赌船网址 150

三种方法,以前笔者会习贯写第三种。当然大家看看生成过的sql和施行功用之后,思想改造了。

公海赌船网址 151

频率之差竟有近六倍

笔者们再对照下count:

公海赌船网址 152

公海赌船网址 153

得出古怪的结论:

  1. 在导航属性之中使用count和应用any品质分别十分小,反而FirstOrDefault()
    != null的点子质量最差。
  2. 在一向属性决断当中any和FirstOrDefault() !=
    null品质分别比非常的小,count品质要差的多。
  3. 从而,不管是直接属性照旧导航属性大家都用any来剖断是或不是存在是最妥帖的。

晶莹剔透标志符

若是由于种种缘由我们要求写上面那样逻辑的话语

公海赌船网址 154

我们能够写成那样越来越好

公海赌船网址 155

看生成的sql就通晓了

公海赌船网址 156

其次种艺术变通的sql要根本得多,品质也更加好。

透明标志符

假若由于各样原因我们供给写下边那样逻辑的讲话

公海赌船网址 157

作者们得以写成这么更加好

公海赌船网址 158

看生成的sql就知道了

公海赌船网址 159

第两种艺术变通的sql要干净得多,品质也更加好。

晶莹剔透标志符

如果由于各类缘由大家供给写上面这样逻辑的讲话

公海赌船网址 160

咱俩得以写成那样越来越好

公海赌船网址 161

看生成的sql就明白了

公海赌船网址 162

第一种方法转换的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();//回滚事务
    }
}

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

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的扩展。

 公海赌船网址 163

公海赌船网址 164

 

补充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的扩充。

公海赌船网址 165

公海赌船网址 166

补充1:

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

补充2:

已打包nuget提供第1手设置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

正文以2头至《C#基础知识巩固体系》

应接热心园友补充!

自定义IQueryable扩展方法

 最后整理下自定义的IQueryable的强大。

 公海赌船网址 167

公海赌船网址 168

 

补充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#基础知识加强种类

招待热心园友补充!

相关文章