您的位置:9159金沙官网 > www.9159.com > 【转】你必须知道的EF知识和经验

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

发布时间:2019-10-24 10:16编辑:www.9159.com浏览(78)

    透明标记符

    假设由于种种缘由大家必要写上边那样逻辑的讲话

    图片 1

    我们能够写成这么更加好

    图片 2

    看生成的sql就知晓了

    图片 3

    第三种艺术生成的sql要根本得多,质量也越来越好。

    【转】你必须知道的EF知识和经验。EntityFramework.Extended

    此地推荐下插件EntityFramework.Extended,看了下,非常不利。

    最大的独特之处正是能够间接批量改变、删除,不用像EF私下认可的内需先做询问操作。

    关于官方EF为何一贯不提供这么的辅助就不明了了。然而使用EntityFramework.Extended要求留意以下几点:

    1. 只支持sql server
    2. 批量改进、删除时不能够兑现业务(也正是出了那多少个不能够回滚)
    3. 并未有联级删除
    4. 不能同EF一起SaveChanges (详见)

    在那改进个难题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();//回滚事务
        }
    }
    

    AutoMapper工具

    地点大家因而Include展现的实践表的接连几日查询显著是情有可原的,但还远远不足。如若大家只须要查询数据的一些字段呢,上边查询全部字段岂不是很浪费内部存款和储蓄器存款和储蓄空间和应用程序与数据库数据传输带宽。

    咱俩得以:

    图片 4

    对应监督到的sql:

    图片 5

    我们看出变化的sql,查询的字段少了大多。唯有我们来得列出来字段的和多个StudentId,StudentId用来三回九转查询条件的。

    是的,这样的主意特不错。不过有未有哪些更加好的方案或艺术啊?答案是自然的。(不然,也不会在此屁话了。)要是表字段比比较多,大家须求运用的字段也丰盛多,导航属性也要命多的时候,那样的手动映射就展现不那么狼狈了。那么接下去大家最初介绍使用AutoMapper来成功映射:

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

    图片 6

    图片 7

    咱俩看看下面查询语句未有七个个的手动映射,而映射都以单独布署了。个中CreateMap应该是要写到Global.asax文件之中的。(其实也等于分手了炫丽部分,清晰了查询语句。留心的同室恐怕注意到了,这种办法还免去了主动Include)

    图片 8

    我们看来了扭转的sql和后面有多少例外,但只生成了一条sql,何况结果也是不利的。(其实正是多了一条CASE WHEN ([Extent2].[Id] IS NOT NULL) THEN 1 END AS [C1]。看起来那条语句并从未什么样实际意义,然则那是AutoMapper生成的sql,同期自己也意味着不知道为啥和EF生成的差别)

    诸如此比做的裨益?

    1. 幸免在循环中拜候导航属性数次实践sql语句。
    2. 【转】你必须知道的EF知识和经验。制止了查询语句中太多的手动映射,影响代码的读书。

    有关AutoMapper的别的部分素材:

    lamdba条件构成

    须要:依据不相同景况询问,或许情状

    1. 询问name=“张三” 的具备学子
    2. 查询name=“张三” 也许 age=18的持有学员

    【转】你必须知道的EF知识和经验。兑今世码:

    图片 9

    是还是不是味到了相像的恶臭图片 10。上面大家来灵活组装Lamdba条件。

    应用方案:

    图片 11图片 12

    【转】你必须知道的EF知识和经验。这段代码小编也是从网络偷的,具体链接找不到了。

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

    图片 13

    有未有美美哒一点图片 14。然后大家看看生成的sql是还是不是正确:

    图片 15

    推荐MiniProfiler插件

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

    大家选择EF和在非常大程度提升了开荒进程,可是随后拉动的是成百上千属性低下的写法和生成不太高速的sql。

    就算如此大家得以采纳SQL Server Profiler来监控施行的sql,可是个人感到正是麻烦,每一趟须求展开、过滤、消亡、关闭。

    在那地刚强推荐四个插件MiniProfiler。实时监察页面伏乞对应实施的sql语句、履行时间。轻巧、方便、指向性强。

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

    图片 16

    自定义IQueryable扩充方法

     最终整理下自定义的IQueryable的扩大。

     图片 17

    图片 18

     

    补充1:

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

    补充2: 

    已打包nuget提供第一手设置 Install-Package Talk.Linq.Extensions 或nuget寻觅 Talk.Linq.Extensions 

     

    结束:

    源码下载:

    正文以联合至《C#基础知识加强系列》

    迎接热心园友补充!

    联表查询总括

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

    代码如下:

    图片 19

    看样子如此的代码,小编先是反应是惨了。又在循环实行sql了。监察和控制如下:

    图片 20

    事实上,大家只要求多少改动就把101条sql造成1条,如下:

    图片 21

    马上变1条。

    图片 22

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

    图片 23

    意识那仅仅只是查询结果集结而已,个中的按考试体系来总括是前后相继获得全数数据后在盘算的(实际不是在数据库内总括,然后径直回到结果),那样平等是萧疏了数据库查询数据传输。

    有关连接查询分组总结咱们能够使用SelectMany,如下:

    图片 24

    监察和控制sql如下:(是或不是简单多了吗?)

    图片 25

    关于SelectMany资料:

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

    务求:查询是还是不是存在名称为“张三”的学习者。(你的代码会怎么写啊?)

    图片 26

    首先种?第二种?第三种?呵呵,笔者原先就是行使的率先种,然后有些许人会说“你count被你用坏了”,后来自己想了想了怎么就被本人用坏了吗?直到相比了这多个语句的个性后小编了然了。

    图片 27

    品质之差竟有四百多倍,count确实被作者用坏了。(作者想,不独有被本身壹人用坏了吧。)

    我们看看地方的Any干嘛的?官方解释是:

    图片 28

    本人多次阅读这几个中文表明,一向不可能驾驭。以致早有人也提议过同样的疑云《实则看不懂MSDN关于 Any 的表明》

    为此作者个人精通也是“鲜明集合中是或不是有成分满足某风流倜傥尺度”。大家来看看any其余用法:

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

    福寿绵绵代码:

    图片 29

    三种方法,从前我会习于旧贯写第风流倜傥种。当然大家看看生成过的sql和施行功用之后,观念改变了。

    图片 30

    频率之差竟有近六倍

    咱俩再对照下count:

    图片 31

    图片 32

    得出奇异的定论:

    1. 在导航属性之中使用count和平运动用any质量分别比十分小,反而FirstOrDefault() != null的点子品质最差。
    2. 在直接属性判别此中any和FirstOrDefault() != null质量分别十分小,count性能要差的多。
    3. 由此,不管是一向属性照旧导航属性大家都用any来决断是还是不是留存是最稳当的。

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

    属性进步之AsNonUnicode

    图片 33

    监察到的sql

    图片 34

    小编们来看EF通常状态变化的sql会在前边带上“N”,要是大家抬高DbFunctions.AsNonUnicode生成的sql是未曾“N”的,当您开掘带上“N”的sql比还没带“N”的 sql查询速度慢超多的时候那就掌握该怎么办。

    (此前用oracle的时候带不带“N”查询效用差异非常显然,今日用sql server测量试验并未开掘怎么差距图片 35。还也许有本人发掘EF6会依据数据库中是nvarchar的时候才会生成带“N”的sql,oracle数据库没测验,风乐趣的同班能够测量检验下)

    数据打算

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

    图片 36

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

    foreach循环的陷进 

    1.有关延迟加载

    图片 37

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

    图片 38

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

    "原来就有开垦的与此 Command 相关联的 DataReader,必需首先将它停业。"

    图片 39

    解决方案:

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

    3.以上两点仅为热身,大家说的牢笼才刚刚起头!

    图片 40

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

    图片 41

    图片 42

    解决方案:使用Include来得接二连三查询(注意:须要手动导入using System.Data.Entity 不然Include只可以传表名字符串)。

    图片 43

    再看MiniProfiler的监督(须臾间101条sql产生了1条,那中间的属性同理可得。)

    图片 44

    留意:以下内容如果未有非常表明,暗中认可使用的EF6.0版本,code first方式。

    质量进步之AsNoTracking

    图片 45

    我们看变化的sql

    图片 46

    sql是生成的千篇一律,可是推行时间却是4.8倍。原因仅仅只是第一条EF语句多加了二个AsNoTracking。

    注意:

    • AsNoTracking干什么的吗?无追踪查询而已,也便是说查询出来的靶子不能一向做改正。所以,我们在做多少集结查询展现,而又没有必要对聚焦改善并更新到数据库的时候,一定毫无忘记加上AsNoTracking。
    • 固然查询进度做了select映射就无需加AsNoTracking。如:db.Students.Where(t=>t.Name.Contains("张三")).select(t=>new (t.Name,t.Age)).ToList();

    EF的预热

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

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

    图片 47

    图片 48

    嘿,不对啊。按名字排序被年龄排序覆盖了。大家相应用ThenBy来组合排序。

    图片 49

    图片 50

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

    图片 51

    图片 52

    更动的sql是相符的。与OrderBy、ThenBy对应的降序有OrderByDescending、ThenByDescending。

    看似好像很周密了。其实不然,大家大多数气象排序是动态的。比方,我们会愈发前端页面分裂的操作供给不相同字段的两样排序。那大家后台应该如何做啊?

    图片 53

    不容置疑,那样产生是没难点的,只要你愿意。能够如此多也许的论断有未有痛感特别SB?是的,大家当然有更加好的解决方案。即使OrderBy能够一贯传字符串???

    解决方案:

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

    图片 54

    然后上边又长又臭的代码能够写成:

    图片 55

    我们看下生成的sql:

    图片 56

    和我们想要的功力完全符合,是或不是深感美美哒!!

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

    本文由9159金沙官网发布于www.9159.com,转载请注明出处:【转】你必须知道的EF知识和经验

    关键词: