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

【转】你得理解之EF知识以及更

只顾:以下内容如果没特意说明,默认使用的EF6.0版本,code first模式。

小心:以下内容如果没有特别说明,默认使用的EF6.0版本,code first模式。

顾:以下内容如果无专门说明,默认使用的EF6.0版本,code first模式。

推荐MiniProfiler插件

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

咱们采用EF和当异常要命程度增长了开发进度,不过随后带动的是不少特性低下的写法和变化不极端高速之sql。

尽管如此咱得以动用SQL Server
Profiler来监控执行之sql,不过个人觉得就是麻烦,每次用开辟、过滤、清除、关闭。

于此强烈推荐一个插件MiniProfiler。实时监察页面请求对诺尽的sql语句、执行时。简单、方便、针对性强。

如图:(切实应用与介绍请动)

推荐MiniProfiler插件

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

我们使用EF和于很挺程度提高了开发进度,不过随着带动的凡众多性质低下的写法和扭转不太高速之sql。

尽管如此咱可行使SQL Server
Profiler来监控执行的sql,不过个人觉得就是麻烦,每次用打开、过滤、清除、关闭。

在此强烈推荐一个插件MiniProfiler。实时监察页面请求对诺执行之sql语句、执行时。简单、方便、针对性强。

如图:(实际行使与介绍请动)

推荐MiniProfiler插件

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

咱俩用EF和于雅老程度提高了付出进度,不过随着带来的凡过剩性能低下的写法与转不太高速的sql。

尽管我们好行使SQL Server
Profiler来监控实施的sql,不过个人认为就是麻烦,每次要打开、过滤、清除、关闭。

以此强烈推荐一个插件MiniProfiler。实时监督页面请求对诺履行之sql语句、执行时间。简单、方便、针对性强。

如图:(切切实实以和介绍请走)

数准备

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

后会让出demo代码下充斥链接

数准备

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

后会被出demo代码下充斥链接

数码准备

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

后面会于出demo代码下充斥链接

foreach循环的陷进 

1.有关推迟加载

央看上图红框。为什么StudentId有价,而Studet为null?因为使用code
first,需要设置导航属性也virtual,才见面加载延迟加载数据。

2.关于在循环中访问导航属性之死处理(接着上面,加上virtual后会报以下很)

“已出开拓的与之 Command 相关联的
DataReader,必须首先用她倒闭。”

化解方案:

  • 方案1、设定ConnectionString加上MultipleActiveResultSets=true,但光适用于SQL
    2005后头的本
  • 方案2、或者先念来放置在List中

3.之上两碰仅为热身,我们说之陷阱才刚刚开始!

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

缓解方案:使用Include显连续查询(注意:需要手动导入using System.Data.Entity
不然Include只能传表名字符串)。

再看MiniProfiler的督察(瞬间101漫漫sql变成了1修,这之中的性能可想而知。)

foreach循环的陷进 

1.有关推迟加载

告看上图红框。为什么StudentId有价,而Studet为null?因为用code
first,需要设置导航属性也virtual,才见面加载延迟加载数据。

2.关于在循环中访问导航属性之百般处理(接着上面,加上virtual后会报以下很)

“已发生开拓的与这 Command 相关联的
DataReader,必须首先用它们倒闭。”

缓解方案:

  • 方案1、设定ConnectionString加上MultipleActiveResultSets=true,但才适用于SQL
    2005事后的版本
  • 方案2、或者先念来放置在List中

3.之上两点仅为热身,我们说的陷阱才刚刚开始!

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

釜底抽薪方案:使用Include显连续查询(注意:需要手动导入using System.Data.Entity
不然Include只能传表名字符串)。

再次看MiniProfiler的督察(瞬间101长条sql变成了1长,这中间的性能可想而知。)

foreach循环的陷进 

1.有关推迟加载

吁看上图红框。为什么StudentId有价,而Studet为null?因为使用code
first,需要设置导航属性也virtual,才见面加载延迟加载数据。

2.关于在循环中访问导航属性的老处理(接着上面,加上virtual后会见报以下很)

“已发出开拓的跟是 Command 相关联的
DataReader,必须首先将她倒闭。”

化解方案:

  • 方案1、设定ConnectionString加上MultipleActiveResultSets=true,但偏偏适用于SQL
    2005以后的本
  • 方案2、或者先念来放置于List中

3.上述两触及才为热身,我们说的陷阱才刚刚开始!

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

解决方案:使用Include显连续查询(注意:需要手动导入using System.Data.Entity
不然Include只能传表名字符串)。

又看MiniProfiler的监察(瞬间101久sql变成了1长达,这中的性能可想而知。)

AutoMapper工具

地方我们通过Include显示的执行表的连续查询显然是对的,但还不够。如果我们仅待查询数据的少数字段呢,上面查询有字段岂不是颇浪费内存存储空间及应用程序与数据库数据传带富。

我们得以:

对诺监督及之sql:

咱们视变化的sql,查询的字段少了森。只有我们来得列下字段的及一个StudentId,StudentId用来连接查询条件的。

正确,这样的办法大不利。可是有没有出什么还好之方案还是艺术也?答案是得之。(不然,也无会见以此处屁话了。)如果表字段非常多,我们得运用的字段也殊多,导航属性也酷多的上,这样的手动映射就亮不那么尴尬了。那么连下去我们开介绍以AutoMapper来成功投:

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

咱俩看看上面查询语句没有一个个底手动映射,而映射都是单身布置了。其中CreateMap应该是一旦描绘及Global.asax文件之中的。(其实呢就算是分开了照部分,清晰了询问语句。细心之同校也许注意到了,这种艺术还未去矣积极Include)

咱俩看了变更的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显示的执行表的连年查询显然是对的,但还不够。如果我们惟有需要查询数据的一些字段呢,上面查询有字段岂不是怪浪费内存存储空间和应用程序与数据库数据传带富。

我们可以:

对诺监督到之sql:

咱们看来变化的sql,查询的字段少了好多。只有咱展示列出来字段的同一个StudentId,StudentId用来连续查询条件的。

然,这样的法子特别是。可是有没发出什么还好的方案还是方式呢?答案是得之。(不然,也未会见在这里屁话了。)如果表字段非常多,我们需要使用的字段也十分多,导航属性为要命多之时节,这样的手动映射就显不那么尴尬了。那么连下我们开介绍以AutoMapper来完成投:

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

俺们来看上面查询语句没有一个个之手动映射,而映射都是独布置了。其中CreateMap应该是如果描绘到Global.asax文件之中的。(其实为即是分别了照部分,清晰了询问语句。细心的同班或注意到了,这种艺术尚免去矣积极Include)

咱俩看到了变化的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显示的执行表的连查询显然是正确的,但还不够。如果我们只是需要查询数据的一些字段呢,上面查询有字段岂不是十分浪费内存存储空间和应用程序与数据库数据传带富。

咱俩可:

针对许监督到的sql:

咱见到变化的sql,查询的字段少了众。只有咱展示列出来字段的跟一个StudentId,StudentId用来连续查询条件的。

不错,这样的方法要命科学。可是有无出什么又好之方案还是艺术啊?答案是一定之。(不然,也无会见以这边屁话了。)如果表字段非常多,我们得运用的字段也生多,导航属性也殊多的当儿,这样的手动映射就展示不那么好看了。那么连下去我们初步介绍以AutoMapper来好投:

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

咱看来地方查询语句没有一个个之手动映射,而映射都是单独布置了。其中CreateMap应该是要是写及Global.asax文件里的。(其实也便是分手了炫耀部分,清晰了查询语句。细心之同桌可能注意到了,这种办法还无去了积极性Include)

咱们视了变动的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

联表查询统计

要求:查询前100独学生考项目(“模拟考试”、“正式考试”)、考试次数、语文平均分、学生姓名,且考试次数超过等于3破。(按考试项目分类统计)

代码如下:

看看如此的代码,我第一反馈是灾难性了。又以循环执行sql了。监控如下:

事实上,我们只待多少改变就管101修sql变成1条,如下:

马上变1条。

俺们开辟查看详细的sql语句

发觉就仅仅只是查询结果集合而已,其中的随考试类别来统计是次用到所有数据后以算的(而非是于数据库内计算,然后径直回到结果),这样平等是荒废了数据库查询数据传。

关于连接查询分组统计我们好使用SelectMany,如下:

监理sql如下:(是不是精简多了吧?)

关于SelectMany资料:

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

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

联表查询统计

渴求:查询前100独学生考项目(“模拟考试”、“正式考试”)、考试次数、语文平均分、学生姓名,且考试次数超过等于3破。(按考试项目分类统计)

代码如下:

观看如此的代码,我先是反应是惨痛了。又以循环执行sql了。监控如下:

实际,我们特待多少改变就管101长长的sql变成1长条,如下:

马上变1条。

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

发觉及时仅仅只是查询结果集合而已,其中的以考试类别来统计是先后用到拥有数据后以算的(而无是于数据库内计算,然后径直回到结果),这样平等是浪费了数据库查询数据传。

至于连接查询分组统计我们可行使SelectMany,如下:

监控sql如下:(是不是简单多矣吧?)

关于SelectMany资料:

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

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

联表查询统计

渴求:查询前100个学生考试项目(“模拟考试”、“正式考试”)、考试次数、语文平均分、学生姓名,且考试次数超过等于3赖。(按考试项目分类统计)

代码如下:

盼这样的代码,我先是感应是惨痛了。又于循环执行sql了。监控如下:

实则,我们一味待多少改变就把101条sql变成1久,如下:

马上变1条。

咱们开拓查看详细的sql语句

意识这仅仅只是查询结果集合而已,其中的本考试类别来统计是先后用到拥有数据后在计算的(而不是以数据库内计算,然后径直归结果),这样平等是荒废了数据库查询数据传。

有关连接查询分组统计我们得以下SelectMany,如下:

监控sql如下:(是不是精简多了吧?)

关于SelectMany资料:

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

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

属性提升的AsNonUnicode

监控到的sql

俺们看来EF正常状态变化的sql会于前面带齐“N”,如果我们抬高DbFunctions.AsNonUnicode生成的sql是从未“N”的,当您发觉带来达“N”的sql比没带“N”的
sql查询速度放缓很多的当儿那么即便清楚该怎么惩罚。

(以前用oracle的时节带不牵动“N”查询效率差别特别显著,今天用sql
server测试并无察觉什么区别。还有自己发现EF6会根据数据库被凡是nvarchar的时才见面生成带“N”的sql,oracle数据库没测试,有趣味的同室可以测试下)

性提升的AsNonUnicode

督查及之sql

咱来看EF正常情况变化的sql会当眼前带及“N”,如果我们添加DbFunctions.AsNonUnicode生成的sql是绝非“N”的,当您意识带来齐“N”的sql比从来不拉动“N”的
sql查询速度迟滞很多底上那么就知晓该怎么收拾。

(以前用oracle的时光带不带来“N”查询效率差别特别强烈,今天因故sql
server测试并没有发觉什么差异。还有自己发觉EF6会根据数据库被是nvarchar的时段才见面生成带“N”的sql,oracle数据库没测试,有趣味之校友可以测试下)

特性提升的AsNonUnicode

监督及之sql

咱俩视EF正常状况变化的sql会在前方带上“N”,如果我们添加DbFunctions.AsNonUnicode生成的sql是未曾“N”的,当你意识带来及“N”的sql比无拉动“N”的
sql查询速度迟滞很多底时节那么就是懂得该怎么收拾。

(以前之所以oracle的下带非带“N”查询效率差别特别扎眼,今天为此sql
server测试并从未发现什么异样。还有我意识EF6会根据数据库中凡nvarchar的时刻才会生成带“N”的sql,oracle数据库没测试,有趣味之同学可以测试下)

性能提升的AsNoTracking

咱们看变化的sql

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

我们看变化的sql

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

俺们看变化的sql

sql是浮动的平型一样,但是执行时也是4.8倍。原因仅仅只是第一长条EF语句子多加了一个AsNoTracking。

注意:

  • AsNoTracking干啊的为?无跟踪查询而已,也就是说查询出来的对象不克一直开修改。所以,我们于召开多少集合查询显示,而与此同时未需对聚集修改并创新至数据库的时刻,一定不要忘记加上AsNoTracking。
  • 比方查询过程做了select映射就非需加AsNoTracking。如:db.Students.Where(t=>t.Name.Contains(“张三”)).select(t=>new
    (t.Name,t.Age)).ToList();

基本上配段组合排序(字符串)

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

哎,不对啊。按名排序为年龄排序覆盖了。我们相应据此ThenBy来构成排序。

不错不错,正是我们怀念如果之功用。如果你切莫思就此ThenBy,且还是升序的言辞,我们也得以:

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

接近好像死周到了。其实不然,我们大部分气象排序是动态的。比如,我们会尤其前端页面不同之操作要求不同字段的异排序。那咱们后台应该怎么开吧?

本,这样好是没有问题之,只要你肯。可以这样多或的论断出无发觉格外SB?是的,我们本发还好之化解方案。要是OrderBy可以一直传字符串???

釜底抽薪方案:

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

然后上面又增长同时臭的代码可以描绘成:

咱看下转移的sql:

同咱们纪念使的作用完全符合,是休是深感美美哒!!

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

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

求:查询名字中含“张三”的学童,先照名排序,再比如年排序。

好家伙,不对啊。按名排序为年龄排序覆盖了。我们应据此ThenBy来组成排序。

不错不错,正是我们怀念只要之功用。如果您莫思用ThenBy,且都是升序的言语,我们啊足以:

浮动的sql是千篇一律的。与OrderBy、ThenBy对应的降序有OrderByDescending、ThenByDescending。

恍如好像挺圆满了。其实不然,我们大部分景排序是动态的。比如,我们会愈前端页面不同之操作要求不同字段的不比排序。那咱们后台应该怎么开啊?

自,这样就是不曾问题的,只要您愿意。可以这么多或者的判断有没有来觉得挺SB?是的,我们本来发双重好之解决方案。要是OrderBy可以一直传字符串???

釜底抽薪方案:

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

接下来上面又增长同时可恨的代码可以形容成:

咱看下别的sql:

同咱们纪念使的职能完全符合,是未是发美美哒!!

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

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

求:查询名字里含“张三”的学员,先随名排序,再遵照年排序。

哎,不对啊。按名排序为年龄排序覆盖了。我们当用ThenBy来成排序。

不错不错,正是我们怀念只要之功能。如果你无思就此ThenBy,且还是升序的语,我们呢得:

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

类好像很完善了。其实不然,我们大部分情况排序是动态的。比如,我们会越来越前端页面不同之操作要求不同字段的不同排序。那咱们后台应该怎么开也?

自然,这样成功是尚未问题的,只要您肯。可以如此多或的判定有无发出发异常SB?是的,我们当然发更好之解决方案。要是OrderBy可以一直传字符串???

缓解方案:

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

接下来上面又长同时可恨的代码可以形容成:

俺们看下别的sql:

及咱们怀念如果之效能完全符合,是匪是感觉美美哒!!

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

lamdba条件构成

求:根据不同情形询问,可能情况

  1. 询问name=“张三” 的持有学员
  2. 询问name=“张三” 或者 age=18底兼具学员

实现代码:

是无是味到了同一的荤。下面我们来活组装Lamdba条件。

解决方案:

当即段代码我耶是自网上偷的,具体链接找不顶了。

下一场我们的代码可以描绘成:

出无来美美哒一点。然后我们看看生成的sql是否正确:

lamdba条件构成

求:根据不同情形询问,可能情况

  1. 询问name=“张三” 的有所学员
  2. 查询name=“张三” 或者 age=18之拥有学员

心想事成代码:

凡是勿是味及了千篇一律的恶臭。下面我们来灵活组装Lamdba条件。

缓解方案:

即段代码我吗是由网上偷的,具体链接找不至了。

然后我们的代码可以写成:

来没发美美哒一点。然后我们省生成的sql是否正确:

lamdba条件构成

求:根据不同情形询问,可能情况

  1. 询问name=“张三” 的兼具学员
  2. 询问name=“张三” 或者 age=18之所有学生

落实代码:

凡是免是味及了同等的臭味。下面我们来灵活组装Lamdba条件。

缓解方案:

顿时段代码我啊是起网上偷的,具体链接找不交了。

接下来我们的代码可以描绘成:

有无发生美美哒一点。然后我们看生成的sql是否正确:

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

要求:查询是否有名字为“张三”的学生。(你的代码会如何形容为?)

率先栽?第二种植?第三种?呵呵,我原先就是是用的第一栽,然后有人说“你count被公用老了”,后来我思了纪念了怎么就让自己于是十分了吧?直到对比了就三单报告句子的特性后自己理解了。

属性的异竟生三百大抵倍,count确实给自己所以非常了。(我眷恋,不止于我一个丁为此很了吧。)

咱们看看上面的Any干嘛的?官方说明是:

本人累读是中文解说,一直无法知晓。甚至早有人为提出了相同的疑点《骨子里看无懂MSDN关于
Any
的诠释》

据此自己个人理解也是“确定集合中是否生素满足某一样原则”。我们来看看any其他用法:

渴求:查询教了“张三”或“李四”的老师

贯彻代码:

少种艺术,以前我会习惯写第一种植。当然我们看看那个成了之sql和履效率之后,看法改变了。

频率的异竟有近六倍

咱们重对照下count:

得出奇怪的定论:

  1. 以导航属性之中用count和运any性能分别不深,反而FirstOrDefault()
    != null的计性能最好差。
  2. 以一直性判断其中any和FirstOrDefault() !=
    null性能分别不要命,count性能如差之大多。
  3. 所以,不管是直性还是导航属性我们都用any来判定是否存在是极稳妥的。

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

要求:查询是否在名字啊“张三”的学童。(你的代码会如何写为?)

率先栽?第二种植?第三种?呵呵,我原先就是是以的率先栽,然后有人说“你count被您用好了”,后来自我想了相思了怎么就被我因此异常了邪?直到对比了当时三个报告句之习性后自晓得了。

特性的差竟产生三百多加倍,count确实为我为此非常了。(我思念,不止于我一个丁为此很了咔嚓。)

咱看上面的Any干嘛的?官方说是:

我累读是中文说明,一直无法知晓。甚至早有人为提出过同样的疑云《事实上看不懂MSDN关于
Any
的说》

之所以我个人知道也是“确定集合中是否有素满足某平等尺度”。我们来探望any其他用法:

务求:查询教了“张三”或“李四”的老师

兑现代码:

少数种艺术,以前我会习惯写第一种植。当然我们看看那个成了之sql和履效率之后,看法改变了。

频率的差竟生近六倍

俺们更比下count:

得出奇怪的下结论:

  1. 以导航属性之中用count和动any性能分别不特别,反而FirstOrDefault()
    != null的章程性能最好差。
  2. 每当直接性判断其中any和FirstOrDefault() !=
    null性能分别不杀,count性能而不等之差不多。
  3. 因此,不管是直接性还是导航属性我们且用any来判断是否在是最好稳妥的。

count(*)被公用老了为(Any的用法)

渴求:查询是否在名字啊“张三”的学童。(你的代码会咋样形容为?)

率先种植?第二种植?第三种?呵呵,我原先就是是以的率先栽,然后有人说“你count被您用好了”,后来本人想了相思了怎么就叫自己用十分了吧?直到对比了立三单报告句子之特性后自己掌握了。

属性的异竟产生三百多倍,count确实为自己所以非常了。(我眷恋,不止于自己一个丁就此好了咔嚓。)

咱看地方的Any干嘛的?官方说是:

我数读之中文说明,一直无法了解。甚至早有人也提出了同样的疑云《事实上看不懂MSDN关于
Any
的解说》

就此我个人知道为是“确定集合中是否有素满足某平等尺度”。我们来探望any其他用法:

务求:查询教了“张三”或“李四”的师

兑现代码:

零星栽方式,以前我会习惯写第一种。当然我们看好成了之sql和行效率之后,看法改变了。

频率的异竟生近六倍

咱们还对照下count:

得出奇怪的下结论:

  1. 当导航属性之中用count和下any性能分别不殊,反而FirstOrDefault()
    != null的方法性能最好差。
  2. 以直接性判断其中any和FirstOrDefault() !=
    null性能分别不很,count性能而不等之大半。
  3. 故此,不管是直接性还是导航属性我们且用any来判定是否留存是极端稳妥的。

透明标识符

若由于各种缘由我们用写下面这样逻辑的讲话

咱俩可以描绘成这么又好

看生成的sql就明白了

次种艺术转的sql要彻底得差不多,性能也再次好。

晶莹剔透标识符

要是由于各种原因我们得写下面这样逻辑的言辞

咱得以描绘成这样还好

看生成的sql就清楚了

其次种方式生成的sql要干净得几近,性能也再好。

晶莹剔透标识符

假如由于各种原因我们要写下面这样逻辑的口舌

咱们好写成这样再好

看生成的sql就掌握了

仲栽办法转变的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的扩大。

 

 

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

 

 

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

 

 

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

迎热心园友补充!