以下是人力资源中最广泛的7张报表。

【转】你必须领会的EF知识和经验

人士结构解析

从单位、工龄、性别总体的解析任何员工的遍布

统计 1

瞩目:以下内容假使没有专门表明,默认使用的EF6.0版本,code first情势。

新增员工分析

从学历和来自分析新增员工

统计 2

推荐MiniProfiler插件

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

大家接纳EF和在很大程度进步了开支速度,不过随后带动的是多多益善性能低下的写法和生成不太高速的sql。

即便大家得以接纳SQL Server
Profiler来监控实施的sql,然而个人认为就是麻烦,每一趟需要打开、过滤、清除、关闭。

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

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

统计 3

人口离职分析

从原因和趋势分析

统计 4

数量准备

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

统计 5

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

机构层级

统计 6

foreach循环的陷进 

1.有关延迟加载

统计 7

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

统计 8

2.有关在循环中做客导航属性的至极处理(接着下面,加上virtual后会报以下分外)

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

统计 9

缓解方案:

  • 方案1、设定ConnectionString加上MultipleActiveResultSets=true,但只适用于SQL
    2005从此的版本
  • 方案2、或者先读出放置在List中

3.上述两点仅为热身,我们说的陷阱才刚刚起首!

统计 10

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

统计 11

统计 12

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

统计 13

再看MiniProfiler的监察(弹指间101条sql变成了1条,这里面的习性由此可见。)

统计 14

学历层级

统计 15

AutoMapper工具

地点我们通过Include展现的执行表的连续查询彰着是毋庸置疑的,但还不够。假设我们只需要查询数据的一些字段呢,上边查询所有字段岂不是很浪费内存存储空间和应用程序与数据库数据传输带宽。

俺们能够:

统计 16

对应监督到的sql:

统计 17

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

不错,这样的章程很不错。可是有没有什么样更好的方案或艺术啊?答案是早晚的。(不然,也不会在这边屁话了。)假设表字段相当多,我们需要采纳的字段也充裕多,导航属性也要命多的时候,那样的手动映射就彰显不那么窘迫了。那么接下去我们起先介绍使用AutoMapper来形成映射:

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

统计 18

统计 19

我们看来下边查询语句没有一个个的手动映射,而映射都是单独布置了。其中CreateMap应该是要写到Global.asax文件之中的。(其实也就是分手了炫耀部分,清晰了查询语句。细心的校友也许注意到了,这种艺术还免去了积极性Include)

统计 20

我们来看了转变的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

工龄层级

统计 21

联表查询总计

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

代码如下:

统计 22

见状如此的代码,我第一反响是惨了。又在循环执行sql了。监控如下:

统计 23

实在,我们只需要多少改变就把101条sql变成1条,如下:

统计 24

马上变1条。

统计 25

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

统计 26

发现这仅仅只是查询结果集合而已,其中的按考试连串来总结是程序得到具备数据后在统计的(而不是在数据库内总括,然后直接再次来到结果),这样平等是荒废了数据库查询数据传输。

有关连接查询分组总括我们可以利用SelectMany,如下:

统计 27

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

统计 28

关于SelectMany资料:

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

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

性别层级

统计 29

如上报表模板均来源于于葡萄城报表模板库

转载请注明来源:葡萄城报表

 

连锁阅读:

 【报表福利大放送】100余套报表模板免费下载

还在为画“类Word文档报表”而发愁呢?

多维透视表 –
矩表实现商品销售比较总结

 

特性进步之AsNonUnicode

统计 30

监察到的sql

统计 31

咱俩看看EF正常状态变化的sql会在前头带上“N”,尽管我们抬高DbFunctions.AsNonUnicode生成的sql是未曾“N”的,当您意识带上“N”的sql比一向不带“N”的
sql查询速度慢很多的时候这就掌握该咋做。

(在此往日用oracle的时候带不带“N”查询效率差异特别分明,前几日用sql
server测试并没有发觉怎么差距统计 32。还有本人发现EF6会按照数据库中是nvarchar的时候才会生成带“N”的sql,oracle数据库没测试,有趣味的校友能够测试下)

属性提高之AsNoTracking

统计 33

俺们看变化的sql

统计 34

sql是变化的一模一样,可是实施时间却是4.8倍。原因仅仅只是第一条EF语句多加了一个AsNoTracking。

注意:

  • AsNoTracking干什么的吧?无跟踪查询而已,也就是说查询出来的对象不可能直接做修改。所以,我们在做多少集合查询显示,而又不需要对聚集修改并更新到数据库的时候,一定不要遗忘加上AsNoTracking。
  • 比方查询过程做了select映射就不需要加AsNoTracking。如:db.Students.Where(t=>t.Name.Contains(“张三”)).select(t=>new
    (t.Name,t.Age)).ToList();

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

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

统计 35

统计 36

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

统计 37

统计 38

不错不错,正是大家想要的效力。假诺你不想用ThenBy,且都是升序的话,我们也得以:

统计 39

统计 40

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

仿佛好像很系数了。其实不然,我们大部分情形排序是动态的。比如,大家会愈加前端页面不同的操作要求不同字段的不比排序。这我们后台应该如何做吗?

统计 41

理所当然,这样形成是没问题的,只要你愿意。可以如此多或者的论断有没有痛感那么些SB?是的,我们当然有更好的化解方案。假设OrderBy可以平素传字符串???

釜底抽薪方案:

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

统计 42

接下来上边又长又臭的代码可以写成:

统计 43

俺们看下生成的sql:

统计 44

和我们想要的职能完全符合,是不是感觉美美哒!!

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

lamdba条件构成

要求:依照不同情状询问,可能情状

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

实现代码:

统计 45

是不是味到了一如既往的恶臭统计 46。下面我们来灵活组装Lamdba条件。

解决方案:

统计 47统计 48

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

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

统计 49

有没有美美哒一点统计 50。然后大家看看生成的sql是否正确:

统计 51

EF的预热

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

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

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

统计 52

率先种?第二种?第两种?呵呵,我从前就是使用的第一种,然后有人说“你count被您用坏了”,后来本人想了想了怎么就被我用坏了呢?直到相比较了这三个语句的特性后自己了然了。

统计 53

性能之差竟有三百多倍,count确实被自己用坏了。(我想,不止被自己一个人用坏了吧。)

我们看看地点的Any干嘛的?官方表达是:

统计 54

本身多次阅读这么些粤语演说,平昔无法清楚。甚至早有人也提出过同样的疑云《实际看不懂MSDN关于
Any
的解释

故此自己个人知道也是“确定集合中是否有元素满足某一规范”。我们来探望any其他用法:

务求:查询教过“张三”或“李四”的先生

落实代码:

统计 55

二种艺术,从前我会习惯写第一种。当然我们看看生成过的sql和实践效用之后,看法改变了。

统计 56

频率之差竟有近六倍

咱俩再对照下count:

统计 57

统计 58

得出奇怪的定论:

  1. 在导航属性之中使用count和采用any性能分别不大,反而FirstOrDefault()
    != null的法子性能最差。
  2. 在直接属性判断其中any和FirstOrDefault() !=
    null性能分别不大,count性能要差的多。
  3. 于是,不管是直接属性仍然导航属性我们都用any来判定是否留存是最稳妥的。

透明标识符

假诺由于各类原因大家需要写上边这样逻辑的口舌

统计 59

俺们可以写成这么更好

统计 60

看生成的sql就了解了

统计 61

第三种艺术生成的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();//回滚事务
    }
}

自定义IQueryable扩充方法

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

 统计 62

统计 63

 

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

欢迎热心园友补充!