对于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说明成功
}
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说明成功
}
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 }) > ;
//直接会生成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() > ;//在where后面直接跟Delete就可以实现批量删除了, 是不是很方便?
}
return isOk;
}

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

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

entity framework 新手入门篇(4)-entity framework扩展之 entityframework.extended的更多相关文章

  1. entity framework 新手入门篇(3)-entity framework实现orderby,count,groupby,like,in,分页等

    前面我们已经学习了entityframework的基本的增删改查,今天,我们将在EF中实现一些更加贴近于实际功能的SQL方法. 承接上面的部分,我们有一个叫做House的数据库,其中包含house表和 ...

  2. entity framework 新手入门篇(2)-entity framework基本的增删改查

    经过前两节的简单描述,终于可以进入entity framework的使用部分了.本节将对entity framework原生的增删改查进行讲解. 承接上面的部分,我们有一个叫做House的数据库,其中 ...

  3. entity framework 新手入门篇(1)-建立模型

    entity framework是微软官方免费提供给大家的一套ORM(Object Relational Mapping对象关系映射)解决方案.它不仅可以帮助我们解决数据缓存的问题,还能在最小的开销下 ...

  4. entity framework 新手入门篇(1.5)-lambda表达式与linq

    在建立好了EF模型之后,先不着急使用它,在使用它之前,你还需要了解两个相关的技术,lambda表达式与linq. 作为微软C#语言中重要的语法糖-lambda表达式与LINQ,本质都是一个方法,以la ...

  5. Mysql 该如何 Entity Framework 数据库迁移 和 如何更好的支持EntityFramework.Extended

    问题 1.在使用EntityFramework访问Mysql的时候,使用迁移来生成数据库或者更新数据库时候会遇到一些问题 2.EntityFramework.Extended对Mysql的支持不是很完 ...

  6. iOS简易柱状图(带动画)--新手入门篇

    叨逼叨 好久没更新博客了,才几个月,发生了好多事情,处理了好多事情.不变的是写代码依然在继续. 做点啥子 看看objective-c的书,学着写了个柱状图,只是练习的demo而已,iOS上的图表控件已 ...

  7. Entity Framework 新手入门友好实例

    起因 因为实习的原因,程序之中用到了较多的数据库操作逻辑.如果每一处数据库操作都手写的话,工作量较大且后期不易于维护,所以希望能通过 ORM 框架来解决这两个问题. 在昨天之前,对于 ORM 这个词汇 ...

  8. Grunt新手入门篇

    今天看到一篇通俗易懂的Grunt入门文章,博主写得很用心,原文请戳:http://yujiangshui.com/grunt-basic-tutorial/ 当时学习 Grunt 的时候,真是很头疼. ...

  9. MYSQL新手入门篇

    一.数据库的简介 什么是数据库? 数据的仓库,如:在atm的实例中我们创建一个db目录称之为数据库 什么是 MySQL.Oracle.SQLite.Access.MS SQL Server等 ? 他们 ...

随机推荐

  1. 【xsy1629】可持久化序列 - 可持久化平衡树

    题意 你现在要用数据结构维护一个长度为n的序列. 这个序列支持三种操作: 1 l r:将序列中的第l项到第r项这一段翻转. 2 l r:查询序列中[l,r]这一段的和. 3 p:回到第p个历史版本. ...

  2. IIS 常见问题集记录

    win7 iis7.5 详细错误信息模块 IIS Web Core 通知 BeginRequest 处理程序 尚未确定 错误代码 0x80070021 配置错误 不能在此路径中使用此配置节.如果在父级 ...

  3. ElasticSearch 5.0.1 java API操作

    今天来说下使用ES 5.0.1的API来进行编码. 开始之前,简单说下5.0.1跟之前的几个变化.之前的ES自身是不支持delete-by-query的,也就是通过查询来删除,可以达到批量的效果,是因 ...

  4. 学习PYTHON之路, DAY 6 - PYTHON 基础 6 (模块)

    一 安装,导入模块 安装: pip3 install 模块名称 导入: import module from module.xx.xx import xx from module.xx.xx impo ...

  5. [IOS 开发] TableView、多个TableViewCell、自定义Cell、Cell上画画(故事板+代码方式)

    第一步: //UserTableViewCell.h这里定义第一种Cell #import <UIKit/UIKit.h> @interface UserTableViewCell : U ...

  6. PDF 补丁丁 0.5.0.2520 测试版发布:新春快乐!

    新的PDF测试版今天发布了. 新的测试版比旧测试版本增加了如下功能: 合并文件功能可以导出.导入文件列表,方便合并大量文件.一天干不完,保存一下,明天继续来. 合并文件功能可以统一已合并文件的旋转方向 ...

  7. 关于MVC4项目从32位机移到64位机编译报错解决方案

    早上写了个MVC WEBAPI的demo 机子环境是:XP SP3+ VS2010 + ASP.NET MVC4 然后晚上拿回笔记本进行编译运行,结果报错如下: “/”应用程序中的服务器错误. 分析器 ...

  8. spark 1.5.2配置记录

    1)slaves # A Spark Worker will be started on each of the machines listed below. dataNode 2)spark-env ...

  9. [css3]跑马灯

    <div class="marquee"> <div> <p>纯CSS3生成的走马灯效果</p> <p>纯CSS3生成的 ...

  10. 基础篇-初步认识PE格式

    1 PE(Portable Executable)格式,是Win32环境可移植可执行文件(如exe.dll.vxd.sys和vdm等)的标准文件格式.PE格式衍生于早期建立在VAX(R)VMS(R)上 ...