EF的泛型封装 写的很好 转自Fly_Elephant http://www.cnblogs.com/xiaofeixiang/p/4188600.html?utm_source=tuic...

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();   

转载于:https://www.cnblogs.com/wangkaipeng/p/4506897.html

这个网页是 Kotlin 官方文档中关于泛型的部分。泛型是一种让函数、类、接口能够处理多种类型数据的方式,使得代码更加通用和可复用。 在 Kotlin 中声明泛型类型使用尖括号 `<>`,例如: ``` class Box<T>(t: T) { var value = t } ``` 这里的 `T` 是一个泛型参数,可以是任何类型。 Kotlin 中的函数也可以使用泛型。例如: ``` fun <T> singletonList(item: T): List<T> { return listOf(item) } ``` 这里的 `<T>` 表示这是一个泛型函数,`T` 可以是任何类型。该函数会返回一个只包含一个元素的列表,该元素的类型为 `T`。 有时候需要限制泛型参数的类型,可以使用泛型约束。例如: ``` fun <T : Number> convertToInt(value: T): Int? { return value.toInt() } ``` 这里的 `<T : Number>` 表示 `T` 必须是 `Number` 类或其子类的类型。该函数会将 `value` 转换为整数类型。 星号投影(`*`)是一个特殊的泛型类型,表示任意类型。例如: ``` fun printList(list: List<*>) { println(list.joinToString()) } ``` 这里的 `List<*>` 表示这个列表可以是任意类型,不需要知道具体类型。该函数会输出该列表的所有元素。 精华部分: - 泛型能够让函数、类、接口能够处理多种类型数据的方式,使得代码更加通用和可复用。 - 声明泛型类型使用尖括号 `<>`,例如:`class Box<T>(t: T) { var value = t }` - Kotlin 中的函数也可以使用泛型,例如:`fun <T> singletonList(item: T): List<T> { return listOf(item) }` - 有时候需要限制泛型参数的类型,可以使用泛型约束,例如:`fun <T : Number> convertToInt(value: T): Int? { return value.toInt() }` - 星号投影(`*`)是一个特殊的泛型类型,表示任意类型,例如:`fun printList(list: List<*>) { println(list.joinToString()) }`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值