暗许使用的EF6.0版本

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

特性升高之AsNoTracking

图片 1

大家看变化的sql

图片 2

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();

EF的预热

http://www.cnblogs.com/dudu/p/entity-framework-warm-up.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();//回滚事务
    }
}

推荐MiniProfiler插件

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

我们使用EF和在十分的大程度进步了支出进度,可是随着带来的是过多性质低下的写法和浮动不太高速的sql。

尽管大家得以应用SQL Server
Profiler来监控实施的sql,可是个人认为正是麻烦,每一趟须求开荒、过滤、清除、关闭。

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

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

图片 3

foreach循环的陷进 

壹.关于推迟加载

图片 4

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

图片 5

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

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

图片 6

消除方案:

  • 方案一、设定ConnectionString加上MultipleActiveResultSets=true,但只适用于SQL
    200五之后的版本
  • 方案2、恐怕先读出放置在List中

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

图片 7

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

图片 8

图片 9

化解方案:使用Include展现延续查询(注意:供给手动导入using System.Data.Entity
不然Include只可以传表名字符串)。

图片 10

再看MiniProfiler的监督检查(须臾间拾一条sql形成了一条,那在那之中的品质由此可见。)

图片 11

AutoMapper工具

地方大家经过Include展现的实践表的连天查询显著是不错的,但还相当不足。借使我们只必要查询数据的有些字段呢,下面查询全体字段岂不是很浪费内部存款和储蓄器存款和储蓄空间和应用程序与数据库数据传输带宽。

我们能够:

图片 12

对应监督到的sql:

图片 13

我们看到变化的sql,查询的字段少了广大。唯有大家来得列出来字段的和多个StudentId,StudentId用来接二连三查询条件的。

没有错,那样的章程很不错。可是有没有怎么着更加好的方案或艺术啊?答案是一定的。(不然,也不会在此地屁话了。)借使表字段相当的多,大家需求运用的字段也相当多,导航属性也极其多的时候,那样的手动映射就体现不那么难堪了。那么接下去大家初阶介绍使用AutoMapper来实现映射:

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

图片 14

图片 15

作者们看看地点查询语句未有贰个个的手动映射,而映射都是独自安排了。当中CreateMap应该是要写到Global.asax文件之中的。(其实也正是分离了炫目部分,清晰了查询语句。细心的同班恐怕注意到了,这种办法还免去了当仁不让Include)

图片 16

我们看出了变化的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

lamdba条件构成

渴求:依照不一样情形询问,或许景况

  1. 查询name=“张3” 的兼具学员
  2. 询问name=“张3” 大概 age=1八的全数学生

贯彻代码:

图片 17

是否味到了同样的臭气图片 18。上边大家来灵活组装Lamdba条件。

解决方案:

图片 19图片 20

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

下一场我们的代码能够写成:

图片 21

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

图片 23

属性升高之AsNonUnicode

图片 24

监察到的sql

图片 25

咱俩看来EF符合规律情状变化的sql会在后边带上“N”,倘若大家增加DbFunctions.AsNonUnicode生成的sql是不曾“N”的,当你发觉带上“N”的sql比尚未带“N”的
sql查询速度慢多数的时候那就了然该如何做。

(从前用oracle的时候带不带“N”查询成效差距非常明显,今日用sql
server测试并从未开采什么样差距图片 26。还会有本身发觉EF陆会根据数据库中是nvarchar的时候才会生成带“N”的sql,oracle数据库没测试,风乐趣的同班能够测试下)

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

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

图片 27

图片 28

哟,不对啊。按名字排序被年龄排序覆盖了。咱们应有用ThenBy来整合排序。

图片 29

图片 30

不错不错,就是我们想要的功效。倘诺您不想用ThenBy,且都是升序的话,咱们也可以:

图片 31

图片 32

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

就如好像很周详了。其实不然,我们大多数景观排序是动态的。举个例子,大家会特别前端页面不相同的操作要求分裂字段的例向外排水序。那大家后台应该如何是好啊?

图片 33

理所当然,这样造成是没难点的,只要你愿意。能够如此多大概的论断有没有痛感那些SB?是的,大家当然有越来越好的化解方案。若是OrderBy能够一向传字符串???

化解方案:

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

图片 34

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

图片 35

作者们看下生成的sql:

图片 36

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

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

foreach循环的陷进 

1.有关延迟加载

图片 37

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

图片 38

二.有关在循环中访问导航属性的要命管理(接着上面,加上virtual后会报以下格外)

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

图片 39

缓和方案:

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

3.之上两点仅为热身,大家说的圈套才刚刚开始!

图片 40

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

图片 41

图片 42

不留余地方案:使用Include呈现接二连三查询(注意:要求手动导入using System.Data.Entity
不然Include只好传表名字符串)。

图片 43

再看MiniProfiler的监察(须臾间拾1条sql变成了1条,这之中的习性同理可得。)

图片 44

注意:以下内容假设未有特地表达,私下认可使用的EF6.0版本,code first形式。

lamdba条件构成

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

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

贯彻代码:

图片 45

是否味到了扳平的恶臭图片 46。上边大家来灵活组装Lamdba条件。

减轻方案:

图片 47图片 48

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

然后我们的代码能够写成:

图片 49

有未有美美哒一点图片 50。然后我们看看生成的sql是还是不是正确:

图片 51

性情升高之AsNonUnicode

图片 52

监察和控制到的sql

图片 53

大家看到EF符合规律意况变化的sql会在前方带上“N”,若是大家加多DbFunctions.AsNonUnicode生成的sql是绝非“N”的,当你发觉带上“N”的sql比尚未带“N”的
sql查询速度慢许多的时候那就领会该如何做。

(从前用oracle的时候带不带“N”查询功效差异特别猛烈,明日用sql
server测试并不曾意识什么异样图片 54。还也许有笔者意识EF陆会依据数据库中是nvarchar的时候才会生成带“N”的sql,oracle数据库没测试,有意思味的同桌能够测试下)

【转】你必须了然的EF知识和阅历

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

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

图片 55

首先种?第二种?第三种?呵呵,作者原先就是选用的第三种,然后有一些人讲“你count被你用坏了”,后来自家想了想了怎么就被我用坏了吗?直到相比了那多个语句的习性后笔者明白了。

图片 56

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

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

图片 57

本人反复阅读这么些汉语表明,一直不能通晓。以至早有人也提议过同样的疑点《实际看不懂MSDN关于
Any
的演说

为此自个儿个人精晓也是“明确会集中是还是不是有成分满意某壹标准化”。大家来探望any其余用法:

务求:查询教过“张叁”或“李四”的教员职员和工人

兑当代码:

图片 58

二种方法,以前小编会习于旧贯写第3种。当然大家看看生成过的sql和实行功用之后,观念更换了。

图片 59

频率之差竟有近六倍

作者们再对照下count:

图片 60

图片 61

得出奇异的结论:

  1. 在导航属性之中使用count和选拔any品质分别非常小,反而FirstOrDefault()
    != null的方法质量最差。
  2. 在一贯属性推断个中any和FirstOrDefault() !=
    null质量分别相当的小,count品质要差的多。
  3. 为此,不管是一直属性还是导航属性我们都用any来判别是或不是存在是最妥当的。

属性提高之AsNoTracking

图片 62

我们看变化的sql

图片 63

sql是生成的大同小异,不过执行时间却是4.8倍。原因仅仅只是第2条EF语句多加了三个AsNoTracking。

注意:

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

自定义IQueryable扩充方法

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

 图片 64

图片 65

 

补充1:

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

补充2: 

已打包nuget提供第3手设置 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的恢弘。

 图片 66

图片 67

 

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

迎接热心园友补充!

AutoMapper工具

位置大家由此Include突显的施行表的总是查询显著是天经地义的,但还缺乏。假若大家只须求查询数据的一点字段呢,下边查询全数字段岂不是很浪费内部存款和储蓄器存款和储蓄空间和应用程序与数据库数据传输带宽。

作者们能够:

图片 68

对应监督到的sql:

图片 69

小编们看到变化的sql,查询的字段少了好些个。唯有我们来得列出来字段的和3个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

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

供给:查询是否留存名称为“张3”的学生。(你的代码会怎么样写啊?)

图片 73

率先种?第两种?第两种?呵呵,笔者在此之前正是使用的第3种,然后有些人会说“你count被你用坏了”,后来自身想了想了怎么就被笔者用坏了呢?直到相比较了那三个语句的质量后本身清楚了。

图片 74

质量之差竟有三百多倍,count确实被笔者用坏了。(小编想,不仅被自身1个人用坏了吧。)

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

图片 75

自己频仍阅读那个汉语说明,平昔不可能知晓。乃至早有人也提议过同样的疑云《实则看不懂MSDN关于
Any
的表明

为此自身个人精通也是“明确集结中是或不是有成分满意某一准绳”。大家来探视any其余用法:

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

落实代码:

图片 76

三种艺术,此前小编会习贯写第二种。当然大家看看生成过的sql和实践效用之后,理念更动了。

图片 77

频率之差竟有近六倍

大家再对照下count:

图片 78

图片 79

得出奇异的定论:

  1. 在导航属性之中使用count和应用any品质分别非常小,反而FirstOrDefault()
    != null的法子质量最差。
  2. 在平昔属性判定在这之中any和FirstOrDefault() !=
    null品质分别一点都不大,count品质要差的多。
  3. 为此,不管是一贯属性依然导航属性大家都用any来推断是或不是存在是最妥帖的。

透明标志符

假设由于各类缘由大家供给写上边那样逻辑的讲话

图片 80

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

图片 81

看生成的sql就明白了

图片 82

第两种艺术生成的sql要根本得多,性能也越来越好。

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

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

图片 83

图片 84

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

图片 85

图片 86

不错不错,就是大家想要的效果。借令你不想用ThenBy,且都是升序的话,我们也能够:

图片 87

图片 88

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

恍如好像很完美了。其实不然,大家超越5/10情状排序是动态的。举个例子,大家会愈加前端页面不一样的操作供给差异字段的例向外排水序。这我们后台应该怎么办吧?

图片 89

本来,那样成功是没难题的,只要您愿意。能够这么多或然的论断有未有痛感非常SB?是的,我们当然有更加好的化解方案。假设OrderBy能够直接传字符串???

消除方案:

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

图片 90

下一场上边又长又臭的代码可以写成:

图片 91

大家看下生成的sql:

图片 92

和我们想要的效应完全符合,是或不是以为美美哒!!

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

推荐MiniProfiler插件

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

咱俩应用EF和在极大程度提升了付出速度,不过随后拉动的是相当的多本性低下的写法和扭转不太高速的sql。

虽说我们得以应用SQL Server
Profiler来监察和控制施行的sql,但是个人认为就是麻烦,每趟要求开采、过滤、清除、关闭。

在那边刚强推荐3个插件MiniProfiler。实时监察页面请求对应实行的sql语句、实行时间。轻巧、方便、针对性强。

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

图片 93

数码希图

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

图片 94

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

联表查询计算

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

代码如下:

图片 95

看到这么的代码,笔者首先感应是惨了。又在循环试行sql了。监察和控制如下:

图片 96

实质上,大家只需求有个别改换就把101条sql产生1条,如下:

图片 97

马上变1条。

图片 98

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

图片 99

发觉那仅仅只是查询结果群集而已,在那之中的按考试类别来总计是先后获得独具数据后在测算的(而不是在数据库内计算,然后直接回到结果),那样平等是荒废了数据库查询数据传输。

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

图片 100

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

图片 101

关于SelectMany资料:

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

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

晶莹剔透标记符

1旦由于各个缘由大家须求写上边这样逻辑的言语

图片 102

大家能够写成那样越来越好

图片 103

看生成的sql就掌握了

图片 104

第三种办法调换的sql要深透得多,质量也更加好。

数据计划

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

图片 105

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

联表查询计算

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

代码如下:

图片 106

看样子如此的代码,笔者第二反应是惨了。又在循环实施sql了。监察和控制如下:

图片 107

骨子里,大家只要求多少改动就把拾一条sql形成1条,如下:

图片 108

马上变1条。

图片 109

作者们展开查看详细的sql语句

图片 110

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

有关连接查询分组总结大家能够动用SelectMany,如下:

图片 111

监察sql如下:(是否精简多了吧?)

图片 112

关于SelectMany资料:

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

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

EF的预热

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

留神:以下内容就算没有特意表明,暗许使用的EF陆.0版本,code first模式。

相关文章