EF的泛型封装 写的很好 转自Fly_Elephant http://www.cnblogs.com/xiaofeixiang/p/4188600.html?utm_source=tuicool
Entity Framework本身的增删改查其实 已经很方便了,不过做项目的时候用的多了也就觉得有点累了,每个业务实体基本上都涉及到到了增删改查这四个基本的要素,至于封装每个公司可能都不一样,接口,设计模式都用的眼花缭乱,我闲来没事就搞个简单的封装Helper,Github上也有关于EF的扩展Libray,具体没有用过,公司的有自己的封装,自己也没怎么弄,具体地址:https://github.com/loresoft/EntityFramework.Extended.
首先来看段代码,model和context是从数据中直接生成,你可以选择自己习惯的方式:
//新增
User addUser = new User();
addUser.PersonID = 3;
addUser.UserName = "keso";
dbContext.Entry<User>(addUser).State = EntityState.Added;
dbContext.SaveChanges();
//修改
User updateUser = new User();
dbContext.Users.Where(item => item.ID == 2).OrderBy(item => item.ID);
updateUser.UserName = updateUser.UserName + "测试";
dbContext.Entry<User>(updateUser).State = EntityState.Modified;
dbContext.SaveChanges();
//删除
User delUser = dbContext.Users.Where(item => item.ID == 2).First();
dbContext.Entry<User>(delUser).State = EntityState.Deleted;
dbContext.SaveChanges();
如果每个业务实体都这么写一遍,估计公司水准有待提高,而且开发的也该跳起来骂人,本人只是简单封装下新建一个EFHelper,实际开发会封装的更多,不过底层处理是不变的
class EFHelpler<T> where T : class
{
//...
}
新增
方法:
/// <summary>
/// 实体新增
/// </summary>
/// <param name="model"></param>
public void add(params T[] paramList)
{
foreach (var model in paramList)
{
dbContext.Entry<T>(model).State = EntityState.Added;
}
dbContext.SaveChanges();
}
调用:
EFHelpler<User> helper = new EFHelpler<User>();
BaseContext dbContext = new BaseContext();
//新增
List<User> listUser = new List<User>();
for (int i = 0; i < 2; i++)
{
User user = new User();
user.PersonID = i;
user.UserName = "FlyElehant" + i;
listUser.Add(user);
}
helper.add(listUser.ToArray());
Console.WriteLine("新增成功");
查询
查询分了两种,一种是简单的查询,一种是分页的:
/// <summary>
/// 实体查询
/// </summary>
public IEnumerable<T> getSearchList(System.Linq.Expressions.Expression<Func<T, bool>> where)
{
return dbContext.Set<T>().Where(where);
}
/// <summary>
/// 实体分页查询
/// </summary>
/// <typeparam name="TKey"></typeparam>
/// <param name="where"></param>
/// <param name="orderBy"></param>
/// <param name="pageSize"></param>
/// <param name="pageIndex"></param>
/// <returns></returns>
public IEnumerable<T> getSearchListByPage<TKey>(Expression<Func<T, bool>> where, Expression<Func<T, TKey>> orderBy, int pageSize, int pageIndex)
{
return dbContext.Set<T>().Where(where).OrderByDescending(orderBy).Skip((pageIndex - 1) * pageSize).Take(pageSize);
}
简单调用,第二个方式除了分页之外,主要是查询的时候指定一定OrderBy的类型,也就是TKey:
var query = helper.getSearchList(item => item.UserName.Contains("keso"));
var queryMulti = helper.getSearchListByPage<int>(item => item.UserName.Contains("FlyElehant"), order => order.PersonID, 2, 1);
query = queryMulti;
foreach (User user in query)
{
Console.WriteLine(user.UserName);
}
修改
修改代码稍微读了几行,主要是用到了一下反射:
/// <summary>
/// 按照条件修改数据
/// </summary>
/// <param name="where"></param>
/// <param name="dic"></param>
public void update(Expression<Func<T, bool>> where, Dictionary<string, object> dic)
{
IEnumerable<T> result = dbContext.Set<T>().Where(where).ToList();
Type type = typeof(T);
List<PropertyInfo> propertyList = type.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance).ToList();
//遍历结果集
foreach (T entity in result)
{
foreach (PropertyInfo propertyInfo in propertyList)
{
string propertyName = propertyInfo.Name;
if (dic.ContainsKey(propertyName))
{
//设置值
propertyInfo.SetValue(entity, dic[propertyName], null);
}
}
}
dbContext.SaveChanges();
}
调用:
Dictionary<string,object> dic=new Dictionary<string,object>();
dic.Add("PersonID",2);
dic.Add("UserName","keso");
helper.update(item => item.UserName.Contains("keso"), dic);
Console.WriteLine("修改成功");
删除
方法:
/// <summary>
/// 实体删除
/// </summary>
/// <param name="model"></param>
public void delete(params T[] paramList)
{
foreach (var model in paramList)
{
dbContext.Entry<T>(model).State = EntityState.Deleted;
}
dbContext.SaveChanges();
}
调用:
var query = helper.getSearchList(item => item.UserName.Contains("keso"));
helper.delete(query.ToArray());
完整的EFHelper:
class EFHelpler<T> where T : class
{
BaseContext dbContext = new BaseContext();
/// <summary>
/// 实体新增
/// </summary>
/// <param name="model"></param>
public void add(params T[] paramList)
{
foreach (var model in paramList)
{
dbContext.Entry<T>(model).State = EntityState.Added;
}
dbContext.SaveChanges();
}
/// <summary>
/// 实体查询
/// </summary>
public IEnumerable<T> getSearchList(System.Linq.Expressions.Expression<Func<T, bool>> where)
{
return dbContext.Set<T>().Where(where);
}
/// <summary>
/// 实体分页查询
/// </summary>
/// <typeparam name="TKey"></typeparam>
/// <param name="where"></param>
/// <param name="orderBy"></param>
/// <param name="pageSize"></param>
/// <param name="pageIndex"></param>
/// <returns></returns>
public IEnumerable<T> getSearchListByPage<TKey>(Expression<Func<T, bool>> where, Expression<Func<T, TKey>> orderBy, int pageSize, int pageIndex)
{
return dbContext.Set<T>().Where(where).OrderByDescending(orderBy).Skip((pageIndex - 1) * pageSize).Take(pageSize);
}
/// <summary>
/// 实体删除
/// </summary>
/// <param name="model"></param>
public void delete(params T[] paramList)
{
foreach (var model in paramList)
{
dbContext.Entry<T>(model).State = EntityState.Deleted;
}
dbContext.SaveChanges();
}
/// <summary>
/// 按照条件修改数据
/// </summary>
/// <param name="where"></param>
/// <param name="dic"></param>
public void update(Expression<Func<T, bool>> where, Dictionary<string, object> dic)
{
IEnumerable<T> result = dbContext.Set<T>().Where(where).ToList();
Type type = typeof(T);
List<PropertyInfo> propertyList = type.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance).ToList();
//遍历结果集
foreach (T entity in result)
{
foreach (PropertyInfo propertyInfo in propertyList)
{
string propertyName = propertyInfo.Name;
if (dic.ContainsKey(propertyName))
{
//设置值
propertyInfo.SetValue(entity, dic[propertyName], null);
}
}
}
dbContext.SaveChanges();
}
}
个人Demo难免有表达不当或者技术失误的地方,如有不当,请多多指出,感激不尽~
EF的泛型封装 写的很好 转自Fly_Elephant http://www.cnblogs.com/xiaofeixiang/p/4188600.html?utm_source=tuicool的更多相关文章
- Oracle,Sql,procedure 感觉自己写的很棒的一个存储过程
感觉自己写的很棒的一个Oracle存储过程,(其实想说很叼^,^). 集成了一堆操作数据的功能(至少几十), 包括存储过程执行异常信息输出帮助诊断. 亮点很多, 比如`over(partition b ...
- 既然写CSS很容易,那为什么大家还是把CSS写的那么烂呢?
在众成翻译上看到一篇不错的css文章,所以就给转过来. 在你开始阅读这篇文章之前,一定要做好心理准备.因为我写的 90% 都是在发牢骚,只有最后大概 10% 介绍 CSS 技巧之最佳实践.提前给你们打 ...
- 说明你javascript写的很烂的5个问题
Javascript在互联网上名声很臭,但你又很难再找到一个像它这样如此动态.如此被广泛使用.如此根植于我们的生活中的另外一种语言.它的低学习门槛让很多人都称它为学前脚本语言,它另外一个让人嘲笑的东西 ...
- java面试必备知识点-上中下三篇写的很详细
参考博客:写的还是相当的经典 http://www.cnblogs.com/absfree/p/5568849.html 上中下三篇写的很详细 http://blog.csdn.net/riverfl ...
- mybatis写当天 当月的数据 时间段数据https://www.cnblogs.com/xzjf/p/7600533.html
mybatis写当天 当月的数据 时间段数据----https://www.cnblogs.com/xzjf/p/7600533.html
- 吧,其实spring自带的BeanUtils就有这样的功能,引入spring-beans和spring-core之后,就有BeanUtils.copyProperties(a, b);可以实现两个javabean之间的相互拷贝,自己写的就当是研究咯---https://www.cnblogs.com/NieXiaoHui/p/7150928.html
吧,其实spring自带的BeanUtils就有这样的功能,引入spring-beans和spring-core之后,就有BeanUtils.copyProperties(a, b);可以实现两个ja ...
- DataSet和List<T> 泛型之间互相转换 (转载, 作者写的很好)
/DataSet与泛型集合间的互相转换 //利用反射机制将DataTable的字段与自定义类型的公开属性互相赋值. //注意:从DataSet到IList<T>的转换,自定义类型的公开属性 ...
- Entity Framework泛型封装
Entity Framework本身的增删改查其实 已经很方便了,不过做项目的时候用的多了也就觉得有点累了,每个业务实体基本上都涉及到到了增删改查这四个基本的要素,至于封装每个公司可能都不一样,接口, ...
- 这篇文章主要讲解C#中的泛型,泛型在C#中有很重要的地位,尤其是在搭建项目框架的时候。
一.什么是泛型 泛型是C#2.0推出的新语法,不是语法糖,而是2.0由框架升级提供的功能. 我们在编程程序时,经常会遇到功能非常相似的模块,只是它们处理的数据不一样.但我们没有办法,只能分别写多个方法 ...
随机推荐
- 采购件不允许挂BOM
应用 Oracle Bill Of Materiel 层 Level Function 函数名 Funcgtion Name BOM_BOMFDBOM 表单名 Form Name BOMFDBOM ...
- erlang supervisor说明
Supervisor Behaviour是一个用来实现一个supervisor进程来监控其他子进程的模块 子进程可以是另一个supervisor,也可以是一个worker进程. worker进程一般使 ...
- openNebula images
- iOS 退出应用程序
退出应用程序,方法很简单,只是动画效果没有那么好. - (void)exitApplication { AppDelegate *app = [UIApplication sharedApplicat ...
- CodeForces - 61E Enemy is weak
Description The Romans have attacked again. This time they are much more than the Persians but Shapu ...
- C++面试题一大波
//打印1到最大的n位数. //题目:输入数字n.按顺序打印出从1到最大的n位十进制数.比方: //输入3.则打印出1.2.3一直到最大的3位数999. //[陷阱]:这个题目非常easy想到的办法就 ...
- SPOJ QTREE4 lct
题目链接 这个题已经处于花式tle了,改版后的spoj更慢了.. tle的话就多交几把... #include <iostream> #include <fstream> #i ...
- BHO启动IE调试
如下图选择Web Browser Debugger, 输入启动网址
- Servlet基础知识(三)—— 会话机制Session,Session和Cookie的异同
Servlet会话机制: Http是一种无状态协议,它是无记忆的.也就是说,服务器不会保存用户的任何信息,当同一用户再次去访问时,服务器是不认识你的,它还是会建立新的连接. 但有时候我们需要服务器保留 ...
- mysql中中文字符串的截取
SET NAMES 'utf8'; SET v_length = character_length(citys); SET citys = left(citys COLLATE utf8_bin, v ...