对于EF的操作,我们已经有了大概的了解了,但对于实战来说,似乎还欠缺着一些常用的功能,那就是批量的删除,更新数据。

承接上面的部分,我们有一个叫做House的数据库,其中包含house表和seller表。

一、使用原生EF如何实现批量删除和修改?

        //批量修改public static bool UpdateAllPrice(decimal price){bool isOk = false;using (HouseEntities db = new HouseEntities()){var houseList = db.House.ToList();//首先获取所有房屋的列表(相当于select * from house,虽然实际会把*替换为所有字段,这样能提升性能)houseList.ForEach(x => {x.Price = price;//做一个foreach操作来把每一项的价格改为传入的价格db.Entry(x).State = System.Data.Entity.EntityState.Modified;//把修改后的实体标为已修改
                });isOk =  db.SaveChanges() > 0;//若修改数量大于0说明成功
            }return isOk;}//批量删除public static bool DeleteHouseByRegion(string region){bool isOk = false;using (HouseEntities db = new HouseEntities()){var houseList = db.House.Where(x=>x.Region==region).ToList();//首先获取符合条件的房屋的列表houseList.ForEach(x =>{db.Entry(x).State = System.Data.Entity.EntityState.Deleted;//把修改后的实体标为已删除
                });isOk = db.SaveChanges() > 0;//若修改数量大于0说明成功
            }return isOk;}

由上面的示例代码可以看到。无论是批量删除、修改部分数据,还是所有数据。首先都需要对操作对象进行查询并实例化,再使用遍历方法对其进行修改,删除。

这种方式看起来十分奇怪,以前用SQL,Delete House where region='xxx',或者update house set price=123.123所能实现的功能,现在竟然浪费了这么多的功夫,光是浪费功夫也就算了,EF这种写法在性能上也存在着十分巨大的问题(光是每次查询就够浪费性能的了,更别说维护实例的状态,好在EF会对没有更新的对象撤销UPDATE操作,但感觉还是得不偿失)。

那问题在这里已经很明显了,如何解决它呢?那就要用到entityframework中一个非常好用的扩展“Entityframework.Extended”。这是一个开源的扩展类库,需要.NET 4.0以上的版本才能够支持。你可以在nuget和github上找到它。它使用Lambda表达式树的形式,对对象进行了解析,在解析后直接生成SQL指令来完成数据库操作,相比传统SQL来说,这样做不仅使我们的代码更加优美,在安全性和性能方面,也使我们更加放心。

二、Entityframework.Extended安装

和其他类库一样,安装的时候只要在NUGET上进行搜索就行了,如果搜索不到请尝试添加8.8.8.8来做DNS服务器(实在找不到就等等吧,国外网站经常被墙,哪怕是正常的网站)。

如上图所示即可完成安装(什么?你找不到nuget?好吧,我想我的第一篇文章和VS右上角自带的搜索框能帮助你。

三、使用Entityframework.Extended实现批量删除和修改

        //批量更新public static bool UpdateAllPrice(decimal price){bool isOk = false;using (HouseEntities db = new HouseEntities()){isOk = db.House.Update(x => new House() { Price = price }) > 0;//直接会生成update house set price=xxx的语句并返回受影响行数,这里的X无实际作用,但作为MemberInitExpression,其却是不可缺少的一个部分,这里要注意,不能先new对象再进行对象传输,因为抓取准确字段的时候,我们要用到init表达式,如果对象已经被生成,所有非空字段都将被初始化,这对我们来说,完全不必要。
            }return isOk;}//批量删除public static bool DeleteHouseByRegion(string region){bool isOk = false;using (HouseEntities db = new HouseEntities()){isOk = db.House.Where(x => x.Region == region).Delete() > 0;//在where后面直接跟Delete就可以实现批量删除了, 是不是很方便?
            }return isOk;}

上面的代码就是使用extended扩展库之后的写法了,不仅整个代码优美了许多,更实现了更好的性能。在使用扩展库之前,别忘了引用EntityFramework.Extensions命名空间,扩展类是没有SDK自动提醒的。

另外,大家有没有发现?我之前说的,修改,删除,添加操作后一定要savingchanges(),这里没写,是不是错了?当然不是,扩展库直接生成了SQL语句并采用了ADO.NET的方式进行了执行,所以并不需要写savingchanges,在这些扩展方法执行之后就会返回受影响的行数了。

转载于:https://www.cnblogs.com/Damos/p/EF_4.html

entity framework 新手入门篇(4)-entity framework扩展之 entityframework.extended相关推荐

  1. 计算机与交换机基础配置入门,新手入门篇:交换机配置窍门深入学习 -电脑资料...

    新手入门篇:交换机配置技巧深入学习,关于交换机配置技巧的问题,涉及到的东西比较多, 交换机配置技巧一直以来是非常神秘的,不仅对于一般用户,对于绝大多数网管人员来说也是如此,同时也是作为网管水平高低衡量 ...

  2. android 蒙版图片带拖动_黑橙修图:新手入门篇2-一句话带你认识图层蒙版

    大家好,这里是黑橙修图新手入门教程系列. 上一篇文章我么介绍了ps当中最核心的一个概念--图层.那么这篇文章带大家来了解一个与图层密切相关的概念--图层蒙版. 其实,图层蒙版也是一个类似图层的东西,只 ...

  3. CTF-攻防世界web新手入门篇

    CTF-攻防世界web新手入门(全) 攻防世界网址 1.view_source 2.robots 3.backup 4.cookie 5.disabled_button 6.weak_auth 7.s ...

  4. java 英雄联盟回合战斗_如何赢得一场英雄联盟的战斗新手入门篇

    导读:如何赢得一场英雄联盟的战斗?这里面存在非常多的因素,本文是英雄联盟欧服一篇非常入门级的心得手册,新手请进来看看,高手也可以随意看看. 综述 英雄联盟不是刷钱游戏,也不是杀人游戏,更不是类似炮塔防 ...

  5. java微博开发_【新手入门篇】新浪微博应用开发之Java入门篇

    新浪微博应用开发之Java篇 2012年11月11日星期日 一.开发流程简介: 2.  在以下地址创建一个应用,假设创建一个桌面应用: 3.  进入管理中心,查看并记住应用ID和密码: 4.  在&q ...

  6. 【新手入门篇】新浪微博应用开发之Java入门篇

    新浪微博应用开发之Java篇 2012年11月11日星期日 一.开发流程简介: 1.  访问http://open.weibo.com/注册成为开发者 2.  在以下地址创建一个应用,假设创建一个桌面 ...

  7. 嵌入式linux学习路径--新手入门篇

    嵌入式linux如何入门? 前言 基础概念 计算机与嵌入式的关系 操作系统是什么? 程序 网络 ARP IP ICMP TCP UDP DNS DHCP FTP HTTP linux系统命令 目录相关 ...

  8. springboot 关闭懒加载_SpringBoot新手入门篇

    SpringBoot是干哈的 介绍:springboot是由Pivotal团队提供的全新框架.spring的出现是为了解决企业级开发应用的复杂性,spring的通过注册bean的方式来管理类,但是随着 ...

  9. 大数据新手入门篇之Linux网络系统

    Linux网络系统 网络信息 修改主机名 # hostname node01 //本次登录修改 # hostname //查看主机名# vi/etc/hostname //永久修改 # shutdow ...

  10. SpringBoot是什么?干嘛用的?(新手入门篇)

    SpringBoot是干哈的 介绍:springboot是由Pivotal团队提供的全新框架.spring的出现是为了解决企业级开发应用的复杂性,spring的通过注册bean的方式来管理类,但是随着 ...

最新文章

  1. CODEFORCES 55D
  2. Python入门(一)了解与安装
  3. 图解matlab基本操作
  4. HOWTO:如何在代码中获取安装包目标机上的Windows Installer(MSI)版本
  5. OpenCV通过维纳滤镜恢复散焦图像的实例(附完整代码)
  6. 安装ubuntu系统步骤
  7. 第一次接触终极事务处理——Hekaton
  8. c语言a b的和 不用加号,力扣(LeetCode)刷题,简单题(第16期)
  9. JSP弹出窗口和模式对话框
  10. Json 转换 1 转成 true 0 转成false
  11. iphone目录结构
  12. 极限编程(XP)简介
  13. 【我的Android进阶之旅】解决Jenkins编译出现的Gradle错误:Gradle build daemon disappeared unexpectedly
  14. 基于JAVA语言设计的快递系统
  15. PDF如何免费转Word
  16. 4——Hive数仓项目完整流程(在线教育)
  17. Xilinx FPGA器件的速度等级
  18. 学计算机的电脑尺寸多大合适,电脑机箱尺寸一般是多少?对电脑有何影响?
  19. 以wifi为媒介,linux系统与android设备交互
  20. 第14章-Spring AOP通知(Advice)详解

热门文章

  1. 华为充电协议_华为推出超级快充多协议充电器,支持65W USB PD快充输出
  2. 【Matlab学习手记】多元非线性回归
  3. vue 点击某一行的按钮,获取当前行的数据
  4. SiamRPN代码分析:training
  5. Landscape-施密特版图触发器设计
  6. EasyPlayer流媒体播放器播放HLS视频,起播速度慢的技术优化
  7. 2022BUAA数据结构期末大作业的一些想法
  8. 一元四次方程c语言程序编写,一元高次方程数值解法C程序实现探讨..doc
  9. 什么是rich text,富文本?富文本有什么优势?
  10. Android设置图标背景透明