entity framework 新手入门篇(4)-entity framework扩展之 entityframework.extended
对于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的更多相关文章
- entity framework 新手入门篇(3)-entity framework实现orderby,count,groupby,like,in,分页等
前面我们已经学习了entityframework的基本的增删改查,今天,我们将在EF中实现一些更加贴近于实际功能的SQL方法. 承接上面的部分,我们有一个叫做House的数据库,其中包含house表和 ...
- entity framework 新手入门篇(2)-entity framework基本的增删改查
经过前两节的简单描述,终于可以进入entity framework的使用部分了.本节将对entity framework原生的增删改查进行讲解. 承接上面的部分,我们有一个叫做House的数据库,其中 ...
- entity framework 新手入门篇(1)-建立模型
entity framework是微软官方免费提供给大家的一套ORM(Object Relational Mapping对象关系映射)解决方案.它不仅可以帮助我们解决数据缓存的问题,还能在最小的开销下 ...
- entity framework 新手入门篇(1.5)-lambda表达式与linq
在建立好了EF模型之后,先不着急使用它,在使用它之前,你还需要了解两个相关的技术,lambda表达式与linq. 作为微软C#语言中重要的语法糖-lambda表达式与LINQ,本质都是一个方法,以la ...
- Mysql 该如何 Entity Framework 数据库迁移 和 如何更好的支持EntityFramework.Extended
问题 1.在使用EntityFramework访问Mysql的时候,使用迁移来生成数据库或者更新数据库时候会遇到一些问题 2.EntityFramework.Extended对Mysql的支持不是很完 ...
- iOS简易柱状图(带动画)--新手入门篇
叨逼叨 好久没更新博客了,才几个月,发生了好多事情,处理了好多事情.不变的是写代码依然在继续. 做点啥子 看看objective-c的书,学着写了个柱状图,只是练习的demo而已,iOS上的图表控件已 ...
- Entity Framework 新手入门友好实例
起因 因为实习的原因,程序之中用到了较多的数据库操作逻辑.如果每一处数据库操作都手写的话,工作量较大且后期不易于维护,所以希望能通过 ORM 框架来解决这两个问题. 在昨天之前,对于 ORM 这个词汇 ...
- Grunt新手入门篇
今天看到一篇通俗易懂的Grunt入门文章,博主写得很用心,原文请戳:http://yujiangshui.com/grunt-basic-tutorial/ 当时学习 Grunt 的时候,真是很头疼. ...
- MYSQL新手入门篇
一.数据库的简介 什么是数据库? 数据的仓库,如:在atm的实例中我们创建一个db目录称之为数据库 什么是 MySQL.Oracle.SQLite.Access.MS SQL Server等 ? 他们 ...
随机推荐
- 了解Android的编译器
了解一下Android的编译器并记录下来: Android在4.4以前是使用Dalvik VM的,通过Just In Time(JIT即时编译)来完成编译工作,在Android4.4提供了一种测试版本 ...
- swiper横向轮播(兼容IE8)
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- text/plain && text/html
text/plain和text/html都是Content-Type; text/plain : 页面以文本形式输出 text/html: 页面以html格式输出
- Win10重复按键盘经常按不出?Win10关闭筛选键步骤
在Win10系统中,有用户发现,有时重复按一个键位,经常会出现打不出字符的情况,导致输入效率降低,其实这很有可能是你开启了筛选键导致,筛选键帮助用户忽略那些短时间的按键动作,下面我们就来看看win10 ...
- for循环每次展示固定条数的数据的写法。
第一种是一组json数据实现分页的效果,也就是每一次展示5条数据.第二种场景是每一秒展示4条数据,直到全部显示完.两种思路都做个笔记记录下. var nums = 5; //每页出现的数量 var p ...
- Android开发--Android Studio配置
1.常见问题 emulator: You might want to adjust your AVD RAM size and/or HAXM configuration to run in fast ...
- Window.document对象
1.Window.document对象 一.找到元素: docunment.getElementById("id"):根据id找,最多找一个: var a =docunme ...
- [转]C#中POST数据和接收的几种方式
POST方式提交数据,一种众所周知的方式: html页面中使用form表单提交,接收方式,使用Request.Form[""]或Request.QueryString[" ...
- iOS中 HTTP/Socket/TCP/IP通信协议详解
// OSI(开放式系统互联), 由ISO(国际化标准组织)制定 // 1. 应用层 // 2. 表示层 // 3. 会话层 // 4. 传输层 // 5. 网络层 // 6. 数据链接层 // 7. ...
- Python之路,Day6 - 面向对象学习
本节内容: 面向对象编程介绍 为什么要用面向对象进行开发? 面向对象的特性:封装.继承.多态 类.方法. 引子 你现在是一家游戏公司的开发人员,现在需要你开发一款叫做<人狗大战>的游戏 ...