日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

第十九节: 结合【表达式目录树】来封装EF的BaseDal层的方法

發布時間:2023/12/10 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第十九节: 结合【表达式目录树】来封装EF的BaseDal层的方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一. 簡介

?  該章節,可以說是一個簡單輕松的章節,只要你對Expression表達式樹、EF的基本使用、泛型有所了解,那么本章節實質上就是一個非常簡單的封裝章節,便于我們快捷開發。

 PS:在該章節對于EF的上下文怎么處理,怎么來的,不做介紹,在后續的框架篇將詳細介紹,下面的EF上下文,將直接使用db代替。

 如果你對Expression、EF的增刪改查、泛型生疏的話,可以先閱讀以下章節:

  (1). Expression表達式目錄樹:http://www.cnblogs.com/yaopengfei/p/7486870.html

  (2). EF的基本增刪改查:http://www.cnblogs.com/yaopengfei/p/7674715.html

  (3). 泛型的使用:http://www.cnblogs.com/yaopengfei/p/6880629.html

二. 代碼封裝分享

?  下面的代碼封裝,主要就是圍繞EF的增刪改查進行封裝以及各自對應的擴展,其中包括事務一體的封裝、事務分離的封裝、集成 Z.EntityFramework.Extensions 插件的封裝、以及EF調用SQL語句的封裝。

1. EF調用SQL語句:

1 /// <summary>2 /// 執行增加,刪除,修改操作(或調用存儲過程)3 /// </summary>4 /// <param name="sql"></param>5 /// <param name="pars"></param>6 /// <returns></returns>7 public int ExecuteSql(string sql, params SqlParameter[] pars)8 {9 return db.Database.ExecuteSqlCommand(sql, pars); 10 } 11 12 /// <summary> 13 /// 執行查詢操作 14 /// </summary> 15 /// <typeparam name="T"></typeparam> 16 /// <param name="sql"></param> 17 /// <param name="pars"></param> 18 /// <returns></returns> 19 public List<T> ExecuteQuery<T>(string sql, params SqlParameter[] pars) 20 { 21 return db.Database.SqlQuery<T>(sql, pars).ToList(); 22 }

2. EF增刪改查封裝(事務一體)

?(1). 新增

1 public int Add(T model) 2 { 3 DbSet<T> dst = db.Set<T>(); 4 dst.Add(model); 5 return db.SaveChanges(); 6 }

(2). 刪除

1 /// <summary>2 /// 刪除(適用于先查詢后刪除的單個實體)3 /// </summary>4 /// <param name="model">需要刪除的實體</param>5 /// <returns></returns>6 public int Del(T model)7 {8 db.Set<T>().Attach(model);9 db.Set<T>().Remove(model); 10 return db.SaveChanges(); 11 } 12 /// <summary> 13 /// 根據條件刪除(支持批量刪除) 14 /// </summary> 15 /// <param name="delWhere">傳入Lambda表達式(生成表達式目錄樹)</param> 16 /// <returns></returns> 17 public int DelBy(Expression<Func<T, bool>> delWhere) 18 { 19 List<T> listDels = db.Set<T>().Where(delWhere).ToList(); 20 listDels.ForEach(d => 21 { 22 db.Set<T>().Attach(d); 23 db.Set<T>().Remove(d); 24 }); 25 return db.SaveChanges(); 26 }

(3). 查詢

1 /// <summary>2 /// 根據條件查詢3 /// </summary>4 /// <param name="whereLambda">查詢條件(lambda表達式的形式生成表達式目錄樹)</param>5 /// <returns></returns>6 public List<T> GetListBy(Expression<Func<T, bool>> whereLambda)7 {8 return db.Set<T>().Where(whereLambda).ToList();9 } 10 /// <summary> 11 /// 根據條件排序和查詢 12 /// </summary> 13 /// <typeparam name="Tkey">排序字段類型</typeparam> 14 /// <param name="whereLambda">查詢條件</param> 15 /// <param name="orderLambda">排序條件</param> 16 /// <param name="isAsc">升序or降序</param> 17 /// <returns></returns> 18 public List<T> GetListBy<Tkey>(Expression<Func<T, bool>> whereLambda, Expression<Func<T, Tkey>> orderLambda, bool isAsc = true) 19 { 20 List<T> list = null; 21 if (isAsc) 22 { 23 list = db.Set<T>().Where(whereLambda).OrderBy(orderLambda).ToList(); 24 } 25 else 26 { 27 list = db.Set<T>().Where(whereLambda).OrderByDescending(orderLambda).ToList(); 28 } 29 return list; 30 } 31 /// <summary> 32 /// 分頁查詢 33 /// </summary> 34 /// <typeparam name="Tkey">排序字段類型</typeparam> 35 /// <param name="pageIndex">頁碼</param> 36 /// <param name="pageSize">頁容量</param> 37 /// <param name="whereLambda">查詢條件</param> 38 /// <param name="orderLambda">排序條件</param> 39 /// <param name="isAsc">升序or降序</param> 40 /// <returns></returns> 41 public List<T> GetPageList<Tkey>(int pageIndex, int pageSize, Expression<Func<T, bool>> whereLambda, Expression<Func<T, Tkey>> orderLambda, bool isAsc = true) 42 { 43 44 List<T> list = null; 45 if (isAsc) 46 { 47 list = db.Set<T>().Where(whereLambda).OrderBy(orderLambda) 48 .Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList(); 49 } 50 else 51 { 52 list = db.Set<T>().Where(whereLambda).OrderByDescending(orderLambda) 53 .Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList(); 54 } 55 return list; 56 } 57 /// <summary> 58 /// 分頁查詢輸出總行數 59 /// </summary> 60 /// <typeparam name="Tkey">排序字段類型</typeparam> 61 /// <param name="pageIndex">頁碼</param> 62 /// <param name="pageSize">頁容量</param> 63 /// <param name="whereLambda">查詢條件</param> 64 /// <param name="orderLambda">排序條件</param> 65 /// <param name="isAsc">升序or降序</param> 66 /// <returns></returns> 67 public List<T> GetPageList<Tkey>(int pageIndex, int pageSize, ref int rowCount, Expression<Func<T, bool>> whereLambda, Expression<Func<T, Tkey>> orderLambda, bool isAsc = true) 68 { 69 int count = 0; 70 List<T> list = null; 71 count = db.Set<T>().Where(whereLambda).Count(); 72 if (isAsc) 73 { 74 var iQueryList = db.Set<T>().Where(whereLambda).OrderBy(orderLambda) 75 .Skip((pageIndex - 1) * pageSize).Take(pageSize); 76 77 list = iQueryList.ToList(); 78 } 79 else 80 { 81 var iQueryList = db.Set<T>().Where(whereLambda).OrderByDescending(orderLambda) 82 .Skip((pageIndex - 1) * pageSize).Take(pageSize); 83 list = iQueryList.ToList(); 84 } 85 rowCount = count; 86 return list; 87 }

(4). 修改

1 /// <summary>2 /// 修改3 /// </summary>4 /// <param name="model">修改后的實體</param>5 /// <returns></returns>6 public int Modify(T model)7 {8 db.Entry(model).State = EntityState.Modified;9 return db.SaveChanges();10 }11 12 /// <summary>13 /// 單實體擴展修改(把不需要修改的列用LAMBDA數組表示出來)14 /// </summary>15 /// <param name="model">要修改的實體對象</param>16 /// <param name="ignoreProperties">不須要修改的相關字段</param>17 /// <returns>受影響的行數</returns>18 public int Modify(T model, params Expression<Func<T, object>>[] ignoreProperties)19 {20 using (DbContext db = new DBContextFactory().GetDbContext())21 {22 db.Set<T>().Attach(model);23 24 DbEntityEntry entry = db.Entry<T>(model);25 entry.State = EntityState.Unchanged;26 27 Type t = typeof(T);28 List<PropertyInfo> proInfos = t.GetProperties(BindingFlags.Instance | BindingFlags.Public).ToList();29 30 Dictionary<string, PropertyInfo> dicPros = new Dictionary<string, PropertyInfo>();31 proInfos.ForEach(32 p => dicPros.Add(p.Name, p)33 );34 35 if (ignoreProperties != null)36 {37 foreach (var ignorePropertyExpression in ignoreProperties)38 {39 //根據表達式得到對應的字段信息40 var ignorePropertyName = new PropertyExpressionParser<T>(ignorePropertyExpression).Name;41 dicPros.Remove(ignorePropertyName);42 }43 }44 45 foreach (string proName in dicPros.Keys)46 {47 entry.Property(proName).IsModified = true;48 }49 return db.SaveChanges();50 }51 }52 53 /// <summary>54 /// 批量修改(非lambda)55 /// </summary>56 /// <param name="model">要修改實體中 修改后的屬性 </param>57 /// <param name="whereLambda">查詢實體的條件</param>58 /// <param name="proNames">lambda的形式表示要修改的實體屬性名</param>59 /// <returns></returns>60 public int ModifyBy(T model, Expression<Func<T, bool>> whereLambda, params string[] proNames)61 {62 List<T> listModifes = db.Set<T>().Where(whereLambda).ToList();63 Type t = typeof(T);64 List<PropertyInfo> proInfos = t.GetProperties(BindingFlags.Instance | BindingFlags.Public).ToList();65 Dictionary<string, PropertyInfo> dicPros = new Dictionary<string, PropertyInfo>();66 proInfos.ForEach(p =>67 {68 if (proNames.Contains(p.Name))69 {70 dicPros.Add(p.Name, p);71 }72 });73 foreach (string proName in proNames)74 {75 if (dicPros.ContainsKey(proName))76 {77 PropertyInfo proInfo = dicPros[proName];78 object newValue = proInfo.GetValue(model, null);79 foreach (T m in listModifes)80 {81 proInfo.SetValue(m, newValue, null);82 }83 }84 }85 return db.SaveChanges();86 }87 88 /// <summary>89 /// 批量修改(支持lambda)90 /// </summary>91 /// <param name="model">要修改實體中 修改后的屬性 </param>92 /// <param name="whereLambda">查詢實體的條件</param>93 /// <param name="proNames">lambda的形式表示要修改的實體屬性名</param>94 /// <returns></returns>95 public int ModifyBy(T model, Expression<Func<T, bool>> whereLambda, params Expression<Func<T, object>>[] proNames)96 {97 List<T> listModifes = db.Set<T>().Where(whereLambda).ToList();98 Type t = typeof(T);99 List<PropertyInfo> proInfos = t.GetProperties(BindingFlags.Instance | BindingFlags.Public).ToList(); 100 Dictionary<string, PropertyInfo> dicPros = new Dictionary<string, PropertyInfo>(); 101 if (proNames != null) 102 { 103 foreach (var myProperyExp in proNames) 104 { 105 var my_ProName = new PropertyExpressionParser<T>(myProperyExp).Name; 106 proInfos.ForEach(p => 107 { 108 if (p.Name.Equals(my_ProName)) 109 { 110 dicPros.Add(p.Name, p); 111 } 112 }); 113 if (dicPros.ContainsKey(my_ProName)) 114 { 115 PropertyInfo proInfo = dicPros[my_ProName]; 116 object newValue = proInfo.GetValue(model, null); 117 foreach (T m in listModifes) 118 { 119 proInfo.SetValue(m, newValue, null); 120 } 121 } 122 } 123 } 124 return db.SaveChanges(); 125 } 126

3. EF增刪改封裝(事務分離)

?(1). 事務批量處理

1 /// <summary> 2 /// 事務批量處理 3 /// </summary> 4 /// <returns></returns> 5 public int SaveChange() 6 { 7 return db.SaveChanges(); 8 }

(2). 新增

1 /// <summary> 2 /// 新增 3 /// </summary> 4 /// <param name="model">需要新增的實體</param> 5 public void AddNo(T model) 6 { 7 db.Set<T>().Add(model); 8 }

(3). 修改

1 /// <summary> 2 /// 修改 3 /// </summary> 4 /// <param name="model">修改后的實體</param> 5 public void ModifyNo(T model) 6 { 7 db.Entry(model).State = EntityState.Modified; 8 }

(4). 刪除

/// <summary>/// 刪除/// </summary>/// <param name="model">需要刪除的實體</param>public void DelNo(T model){db.Entry(model).State = EntityState.Deleted;}/// <summary>/// 條件刪除/// </summary>/// <param name="delWhere">需要刪除的條件</param>public void DelByNo(Expression<Func<T, bool>> delWhere){List<T> listDels = db.Set<T>().Where(delWhere).ToList();listDels.ForEach(d =>{db.Set<T>().Attach(d);db.Set<T>().Remove(d);});}

4.?Z.EntityFramework.Extensions 插件封裝

方案一:在使用EF事務分離的方法的前提下,單獨調用提交方法

1 /// <summary> 2 /// 事務提交,速度約為saveChange的10倍-15倍 3 /// </summary> 4 public void BulkSaveChanges() 5 { 6 db.BulkSaveChanges(); 7 }

方案二:插件特有的增刪改方法

/// <summary>/// 新增/// </summary>/// <param name="model">新增的實體集合</param>public void BulkInsert(List<T> model){db.BulkInsert<T>(model);}/// <summary>/// 刪除/// </summary>/// <param name="model">需要刪除的實體集合</param>public void BulkDelete(List<T> model){db.BulkDelete<T>(model);}/// <summary>/// 根據條件刪除/// </summary>/// <param name="delWhere">刪除條件</param>public void BulkDeleteBy(Expression<Func<T, bool>> delWhere){List<T> listDels = db.Set<T>().Where(delWhere).ToList();db.BulkDelete<T>(listDels);}/// <summary>/// 需要修改的實體集合/// </summary>/// <param name="model"></param>public void BulkUpdate(List<T> model){db.BulkUpdate<T>(model);}

?

?

  未完,后續會不斷更新。

?

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的第十九节: 结合【表达式目录树】来封装EF的BaseDal层的方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。