以下是人力资源中极常见的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#基础知识巩固系列》

欢迎热心园友补充!