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 JNI开发
1.NDK简介 NDK(Native Development Kit)NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk.NDK集成了交叉 ...
- console
你所不知道的 Console 2016-12-19 ZHANGXIANGLIANG JavaScript 转自 https://segmentfault.com/a/119000000672160 1 ...
- js判断是手机还是电脑访问网站
js判断是手机还是电脑访问网站 <script type="text/javascript"> <!- ...
- 网页 css 样式 初始化
body, div, ul, ol, dl, dt, dd, li, dl, h1, h2, h3, h4 {margin:0;padding:0;font-style:normal;font:12p ...
- DynamicJson
json字符串解析成Dynamic对象,开源地址http://dynamicjson.codeplex.com/,访问比较慢.使用方法摘录如下: Project Descriptiondynamic ...
- 数据表格datagrid内容整理
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
- vpn是什么?手机vpn是什么?
vpn是什么?手机vpn是什么? vpn是什么?手机vpn是什么? vpn是什么?手机vpn是什么?VPN全称是Virtual Private Network,也就是虚拟专用网的意思.很多人不知道VP ...
- Python Day02
Python 代码执行流程: 编译 --> 执行 源代码 --> 字节码 --> 机器码 --> CPU执行 python 先将自己的源代码,编译成Python 字节 ...
- AngularJS - Passing data between pages
You need to create a service to be able to share data between controllers. app.factory('myService', ...
- IE关闭兼容性视图
不知道什么时候,ie8的“兼容性视图设置”变成了灰色,如图: 今天通过设置组策略,终以解决了这个问题: ie8的兼容性视图设置灰色的解决办法:运行gpedit.msc--用户配置/计算机配置--管理 ...