Entity Framework自己的增刪改查其實 已經很方便了,不過作項目的時候用的多了也就以爲有點累了,每一個業務實體基本上都涉及到到了增刪改查這四個基本的要素,至於封裝每一個公司可能都不同,接口,設計模式都用的眼花繚亂,我閒來沒事就搞個簡單的封裝Helper,Github上也有關於EF的擴展Libray,具體沒有用過,公司的有本身的封裝,本身也沒怎麼弄,具體地址:https://github.com/loresoft/EntityFramework.Extended.java
首先來看段代碼,model和context是從數據中直接生成,你能夠選擇本身習慣的方式:git
//新增 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,實際開發會封裝的更多,不過底層處理是不變的github
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("新增成功");
查詢分了兩種,一種是簡單的查詢,一種是分頁的:spa
/// <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); }
修改代碼稍微讀了幾行,主要是用到了一下反射:blog
/// <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("修改爲功");
方法:ip
/// <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不免有表達不當或者技術失誤的地方,若有不當,請多多指出,感激涕零~