私下认可使用的EF6.0版本

默认使用的EF6.0版本,code first模式

【转】你必须通晓的EF知识和阅历

只顾:以下内容如果未有特地表明,私下认可使用的EF6.0版本,code first方式。

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

推荐MiniProfiler插件

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

我们选取EF和在不小程度进步了支付速度,可是随着带来的是大多品质低下的写法和浮动不太高速的sql。

就算如此大家能够使用SQL Server
Profiler来监察和控制实施的sql,然而个人以为正是麻烦,每一趟要求打开、过滤、清除、关闭。

在那边猛烈推荐贰个插件MiniProfiler。实时监督检查页面需要对应实行的sql语句、实行时间。轻巧、方便、针对性强。

如图:(现实应用和介绍请移步)

澳门永利234555com 1

推荐MiniProfiler插件

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

咱俩运用EF和在不小程度进步了费用速度,但是随着带来的是不计其数属性低下的写法和变化不太高速的sql。

就算如此我们得以采用SQL Server
Profiler来监察和控制施行的sql,但是个人以为就是麻烦,每一趟供给开发、过滤、清除、关闭。

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

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

澳门永利234555com 2

数量希图

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

澳门永利234555com 3

背后会给出demo代码下载链接

数量筹算

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

澳门永利234555com 4

背后会给出demo代码下载链接

foreach循环的陷进 

1.有关延迟加载

澳门永利234555com 5

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

澳门永利234555com 6

2.有关在循环中访问导航属性的老大管理(接着上边,加上virtual后会报以下格外)

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

澳门永利234555com 7

缓和方案:

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

3.之上两点仅为热身,我们说的圈套才刚刚开端!

澳门永利234555com 8

然后大家点击打开迷你Profiler工具(不要被吓到)

澳门永利234555com 9

澳门永利234555com 10

赶尽杀绝方案:使用Include来得接二连三查询(注意:要求手动导入using System.Data.Entity
不然Include只好传表名字符串)。

澳门永利234555com 11

再看MiniProfiler的监察(眨眼之间间101条sql形成了1条,这里面包车型地铁属性同理可得。)

澳门永利234555com 12

foreach循环的陷进 

1.有关延迟加载

澳门永利234555com 13

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

澳门永利234555com 14

2.有关在循环中访谈导航属性的老大管理(接着上边,加上virtual后会报以下非凡)

“已有开采的与此 Command 相关联的
Data里德r,必须首先将它破产。”

澳门永利234555com 15

焚林而猎方案:

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

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

澳门永利234555com 16

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

澳门永利234555com 17

澳门永利234555com 18

化解方案:使用Include来得三番五次查询(注意:需求手动导入using System.Data.Entity
不然Include只好传表名字符串)。

澳门永利234555com 19

再看MiniProfiler的监察(弹指间101条sql产生了1条,这里面包车型大巴习性总之。)

澳门永利234555com 20

AutoMapper工具

地方大家通过Include展现的推行表的接连查询显著是无庸置疑的,但还远远不足。借使咱们只须要查询数据的某个字段呢,上边查询全部字段岂不是很浪费内部存款和储蓄器存款和储蓄空间和应用程序与数据库数据传输带宽。

咱俩得以:

澳门永利234555com 21

对应监督到的sql:

澳门永利234555com 22

大家看出变化的sql,查询的字段少了成都百货上千。唯有我们来得列出来字段的和一个StudentId,StudentId用来连接查询条件的。

是的,这样的办法很不错。可是有未有怎样越来越好的方案或艺术吧?答案是必然的。(否则,也不会在此间屁话了。)假诺表字段相当多,我们必要采纳的字段也丰富多,导航属性也丰裕多的时候,那样的手动映射就显得不那么雅观了。那么接下去我们开首介绍使用AutoMapper来实现映射:

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

澳门永利234555com 23

澳门永利234555com 24

作者们看来上边查询语句未有二个个的手动映射,而映射都是单身安排了。当中CreateMap应该是要写到Global.asax文件之中的。(其实也正是分离了炫酷部分,清晰了查询语句。留意的同窗或者注意到了,这种艺术还免去了积极向上Include)

澳门永利234555com 25

大家看出了转移的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展现的实行表的总是查询鲜明是不错的,但还远远不够。假如大家只须要查询数据的一些字段呢,上边查询全部字段岂不是很浪费内部存款和储蓄器存款和储蓄空间和应用程序与数据库数据传输带宽。

咱俩得以:

澳门永利234555com 26

对应监督到的sql:

澳门永利234555com 27

大家见到变化的sql,查询的字段少了过多。唯有大家来得列出来字段的和一个StudentId,StudentId用来再而三查询条件的。

科学,那样的法子很不错。可是有未有什么越来越好的方案或艺术吧?答案是一定的。(不然,也不会在此处屁话了。)假若表字段相当多,大家要求使用的字段也十分多,导航属性也非常的多的时候,那样的手动映射就呈现不那么窘迫了。那么接下去我们起初介绍使用AutoMapper来成功映射:

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

澳门永利234555com 28

澳门永利234555com 29

作者们看出上边查询语句未有三个个的手动映射,而映射都以单身安排了。当中CreateMap应该是要写到Global.asax文件之中的。(其实也等于分离了炫丽部分,清晰了查询语句。留心的同学恐怕注意到了,这种方法还免去了积极Include)

澳门永利234555com 30

大家见到了扭转的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次。(按考试连串分类总计)

代码如下:

澳门永利234555com 31

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

澳门永利234555com 32

事实上,大家只供给多少改换就把101条sql产生1条,如下:

澳门永利234555com 33

马上变1条。

澳门永利234555com 34

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

澳门永利234555com 35

开采那仅仅只是查询结果集结而已,当中的按考试种类来总结是程序得到具有数据后在图谋的(并不是在数据库内计算,然后直接重临结果),这样平等是荒芜了数据库查询数据传输。

关于连接查询分组总计大家得以选择SelectMany,如下:

澳门永利234555com 36

监督sql如下:(是否轻便多了啊?)

澳门永利234555com 37

关于SelectMany资料:

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

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

联表查询总结

渴求:查询前九二十个学生考试种类(“模拟考试”、“正式考试”)、考试次数、语文平均分、学生姓名,且考试次数超越等于3次。(按考试类别分类总括)

代码如下:

澳门永利234555com 38

观望这么的代码,作者第一反响是惨了。又在循环推行sql了。监控如下:

澳门永利234555com 39

实质上,咱们只必要多少更改就把101条sql形成1条,如下:

澳门永利234555com 40

马上变1条。

澳门永利234555com 41

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

澳门永利234555com 42

察觉那仅仅只是查询结果集结而已,个中的按考试体系来计算是程序得到具有数据后在总括的(并不是在数据库内总计,然后直接重返结果),那样平等是萧条了数据库查询数据传输。

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

澳门永利234555com 43

监察sql如下:(是否轻巧多了吗?)

澳门永利234555com 44

关于SelectMany资料:

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

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

品质升高之AsNonUnicode

澳门永利234555com 45

监督到的sql

澳门永利234555com 46

我们看出EF符合规律意况变化的sql会在最近带上“N”,假诺大家抬高DbFunctions.AsNonUnicode生成的sql是不曾“N”的,当您意识带上“N”的sql比平昔不带“N”的
sql查询速度慢比较多的时候那就清楚该咋办。

(在此从前用oracle的时候带不带“N”查询成效差异特别精晓,后天用sql
server测量检验并未意识什么异样澳门永利234555com 47。还应该有本身开掘EF6会根据数据库中是nvarchar的时候才会生成带“N”的sql,oracle数据库没测验,有意思味的同室能够测量检验下)

个性升高之AsNonUnicode

澳门永利234555com 48

监察到的sql

澳门永利234555com 49

我们看到EF符合规律处境变化的sql会在前头带上“N”,借使大家抬高DbFunctions.AsNonUnicode生成的sql是从未“N”的,当你开采带上“N”的sql比尚未带“N”的
sql查询速度慢很多的时候这就知晓该怎么做。

(以前用oracle的时候带不带“N”查询成效差森松尼度醒目,后天用sql
server测验并从未察觉什么样差距澳门永利234555com 50。还应该有本人发觉EF6会依照数据库中是nvarchar的时候才会生成带“N”的sql,oracle数据库没测量检验,有意思味的同桌能够测验下)

品质提高之AsNoTracking

澳门永利234555com 51

咱俩看变化的sql

澳门永利234555com 52

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

澳门永利234555com 53

大家看变化的sql

澳门永利234555com 54

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

注意:

  • AsNoTracking干什么的啊?无追踪查询而已,也正是说查询出来的靶子不能够直接做修改。所以,大家在做多少集合查询彰显,而又没有须求对集中修改并立异到数据库的时候,一定不要遗忘加上AsNoTracking。
  • 假若查询进度做了select映射就没有供给加AsNoTracking。如:db.Students.Where(t=>t.Name.Contains(“张三”)).select(t=>new
    (t.Name,t.Age)).ToList();

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

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

澳门永利234555com 55

澳门永利234555com 56

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

澳门永利234555com 57

澳门永利234555com 58

不错不错,便是大家想要的功效。若是您不想用ThenBy,且都以升序的话,我们也得以:

澳门永利234555com 59

澳门永利234555com 60

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

周边好像很周全了。其实不然,我们超越53%情况排序是动态的。例如,大家会特别前端页面分化的操作供给不一致字段的例向外排水序。那我们后台应该如何做吧?

澳门永利234555com 61

本来,那样成功是没难点的,只要您愿意。能够那样多大概的判别有未有感觉十一分SB?是的,我们本来有越来越好的缓和方案。假如OrderBy能够直接传字符串???

杀鸡取卵方案:

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

澳门永利234555com 62

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

澳门永利234555com 63

我们看下生成的sql:

澳门永利234555com 64

和大家想要的遵循完全符合,是否认为美美哒!!

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

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

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

澳门永利234555com 65

澳门永利234555com 66

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

澳门永利234555com 67

澳门永利234555com 68

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

澳门永利234555com 69

澳门永利234555com 70

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

恍如好像很完美了。其实不然,大家抢先四分之一景色排序是动态的。比方,大家会越发前端页面差异的操作要求分化字段的两样排序。这大家后台应该咋做吧?

澳门永利234555com 71

本来,那样产生是没难题的,只要您愿意。能够如此多只怕的论断有未有感到特别SB?是的,大家当然有越来越好的消除方案。倘诺OrderBy能够平素传字符串???

焚薮而田方案:

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

澳门永利234555com 72

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

澳门永利234555com 73

笔者们看下生成的sql:

澳门永利234555com 74

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

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

lamdba条件构成

渴求:依照区别情形询问,大概意况

  1. 查询name=“张三” 的兼具学员
  2. 询问name=“张三” 或然 age=18的全数学生

完结代码:

澳门永利234555com 75

是否味到了同一的臭气澳门永利234555com 76。下边我们来灵活组装Lamdba条件。

消除方案:

澳门永利234555com 77澳门永利234555com 78

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

下一场大家的代码可以写成:

澳门永利234555com 79

有没有美美哒一点澳门永利234555com 80。然后大家看看生成的sql是或不是科学:

澳门永利234555com 81

lamdba条件构成

渴求:依据不一致情状询问,可能情况

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

福寿年高代码:

澳门永利234555com 82

是否味到了同样的恶臭澳门永利234555com 83。下面大家来灵活组装Lamdba条件。

缓和方案:

澳门永利234555com 84澳门永利234555com 85

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

下一场大家的代码可以写成:

澳门永利234555com 86

有没有美美哒一点澳门永利234555com 87。然后大家看看生成的sql是或不是准确:

澳门永利234555com 88

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的用法)

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

澳门永利234555com 89

率先种?第三种?第二种?呵呵,我从前就是利用的首先种,然后有的人讲“你count被你用坏了”,后来自个儿想了想了怎么就被小编用坏了呢?直到比较了那一个语句的脾气后小编知道了。

澳门永利234555com 90

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

大家见到上边包车型大巴Any干嘛的?官方解释是:

澳门永利234555com 91

小编频频阅读这一个普通话演讲,平素不能够精晓。以致早有人也建议过一模二样的问号《实质上看不懂MSDN关于
Any
的分解

由此笔者个人了解也是“明确集合中是或不是有成分满意某一尺度”。我们来看看any其余用法:

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

贯彻代码:

澳门永利234555com 92

二种情势,从前小编会习于旧贯写第一种。当然大家看看生成过的sql和试行功用之后,理念更换了。

澳门永利234555com 93

频率之差竟有近六倍

大家再对照下count:

澳门永利234555com 94

澳门永利234555com 95

得出奇异的结论:

  1. 在导航属性之中使用count和利用any质量分别非常的小,反而FirstOrDefault()
    != null的格局质量最差。
  2. 在向来属性剖断在这之中any和FirstOrDefault() !=
    null质量分别相当的小,count品质要差的多。
  3. 就此,不管是平昔属性依旧导航属性我们都用any来判别是还是不是留存是最妥当的。

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

渴求:查询是不是留存名称为“张三”的学生。(你的代码会怎么着写吗?)

澳门永利234555com 96

率先种?第两种?第三种?呵呵,作者从前正是应用的第一种,然后有些人讲“你count被您用坏了”,后来本身想了想了怎么就被本身用坏了呢?直到相比了那五个语句的习性后自身清楚了。

澳门永利234555com 97

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

大家看看地方的Any干嘛的?官方解释是:

澳门永利234555com 98

本人数十回阅读那一个中文表明,一直不只怕清楚。以至早有人也建议过同样的疑问《实则看不懂MSDN关于
Any
的解释

于是自个儿个人精通也是“分明集合中是还是不是有成分满意某一原则”。大家来探视any别的用法:

供给:查询教过“张三”或“李四”的教师的资质

完成代码:

澳门永利234555com 99

二种艺术,在此之前作者会习贯写第一种。当然我们看看生成过的sql和实施功效之后,思想退换了。

澳门永利234555com 100

频率之差竟有近六倍

大家再对照下count:

澳门永利234555com 101

澳门永利234555com 102

得出奇异的下结论:

  1. 在导航属性之中使用count和应用any品质分别一点都不大,反而FirstOrDefault()
    != null的不二秘技质量最差。
  2. 在一贯属性推断在那之中any和FirstOrDefault() !=
    null质量分别相当的小,count品质要差的多。
  3. 于是,不管是平昔属性照旧导航属性大家都用any来推断是不是存在是最安妥的。

晶莹剔透标志符

即使由于各个缘由我们须求写上边那样逻辑的话语

澳门永利234555com 103

笔者们能够写成那样更好

澳门永利234555com 104

看生成的sql就领悟了

澳门永利234555com 105

澳门永利234555com,其次种格局转变的sql要深透得多,质量也更加好。

透明标记符

假诺由于各样原因大家须求写下边那样逻辑的讲话

澳门永利234555com 106

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

澳门永利234555com 107

看生成的sql就驾驭了

澳门永利234555com 108

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

自定义IQueryable增加方法

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

 澳门永利234555com 109

澳门永利234555com 110

 

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

 澳门永利234555com 111

澳门永利234555com 112

 

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

招待热心园友补充!