第十五節:EF Core大數據量處理(一)之EFCore.BulkExtensions


一. 各種性能測試

   這里分享EF、EFCore、EF Core調用SQL語句 分別在1000條、1w、4w、10w下的增刪改查需要的時間。(括號里代表的都是對應的range方法)

1. EF測試 

 2. EFCore測試

  3. EF Core調用SQL語句

 4.  EFCore組裝成SQL語句,insert組裝成單條。

 

二. EFCore.BulkExtensions用法和性能測試

1. 說明

【該組件已收費,后續不再更新和使用】

  通過Nuget安裝程序集【EFCore.BulkExtensions】,該程序集目前版本【3.1.0】,支持CRUD操作,支持的數據庫僅有:SQLServer和SQLite,它是免費開源的。

  GitHub地址:https://github.com/borisdj/EFCore.BulkExtensions

2. 用法說明

(1).Bulk相關(一條操作一個事務,均是傳入實體)

 A.增加:BulkInsert

 B.修改:BulkUpdate,需要傳入完整實體,不傳的字段就會被更新為空

 C.增加或修改:BulkInsertOrUpdate (主鍵存在執行update,不存在執行insert)

 D.刪除:BulkDelete 和 Truncate(刪除整張表)

PS:以上方法均支持Async異步方法。

 1               //1. 增加
 2                 List<T_UserInfor> ulist1 = new List<T_UserInfor>();
 3                 for (int i = 0; i < 100; i++)
 4                 {
 5                     T_UserInfor userInfor = new T_UserInfor()
 6                     {
 7                         id = i.ToString(),
 8                         userName = "ypf",
 9                         userSex = "",
10                         userAge = 111,
11                         addTime = DateTime.Now
12                     };
13                     ulist1.Add(userInfor);
14                 }
15                 dbContext.BulkInsert(ulist1);
16 
17                 //2. 修改
18                 List<T_UserInfor> ulist2 = new List<T_UserInfor>();
19                 for (int i = 0; i < 100; i++)
20                 {
21                     //此處不寫的字段就會被更新成null了
22                     T_UserInfor userInfor = new T_UserInfor()
23                     {
24                         id = i.ToString(),
25                         userName = "ypf1",
26                     };
27                     ulist2.Add(userInfor);
28                 }
29                 dbContext.BulkUpdate(ulist2);
30 
31                 //3. 刪除
32                 List<T_UserInfor> ulist3 = new List<T_UserInfor>();
33                 for (int i = 0; i < 100; i++)
34                 {
35                     //此處不寫的字段就會被更新成null了
36                     T_UserInfor userInfor = new T_UserInfor()
37                     {
38                         id = i.ToString(),
39                     };
40                     ulist3.Add(userInfor);
41                 }
42                 dbContext.BulkDelete(ulist3);

(2).Batch相關

 A.條件刪除:BatchDelete

 B.條件更新:BatchUpdate (可以基於原有數據)

PS:以上方法均支持Async異步方法。

1  //4.條件刪除
2  int count1 = dbContext.T_UserInfor.Where(u => u.id.StartsWith("2")).BatchDelete();
3 
4   //5. 條件更新
5   //5.1 基於原有數據改
6   int count2 = dbContext.T_UserInfor.Where(u => u.id.StartsWith("2")).BatchUpdate(a => new T_UserInfor() { userAge = a.userAge + 1 });
7   //5.2 直接改成新數據
8   int count3 = dbContext.T_UserInfor.Where(u => u.id.StartsWith("2")).BatchUpdate(new T_UserInfor() { userSex = "" });

(3).事務

  和正常用法一樣, using(var transaction = dbContext.Database.BeginTransaction())包裹,有using的情況下, catch中不用寫rollback,走完using如果報錯會自動回滾。

 這種寫法僅支持SQLServer,Sqlite中寫法不一樣

 1                 using (var transaction = dbContext.Database.BeginTransaction())
 2                 {
 3                     try
 4                     {
 5                         List<T_UserInfor> ulist1 = new List<T_UserInfor>();
 6                         for (int i = 0; i < 100; i++)
 7                         {
 8                             T_UserInfor userInfor = new T_UserInfor()
 9                             {
10                                 id = i.ToString(),
11                                 userName = "ypf",
12                                 userSex = "",
13                                 userAge = 111,
14                                 addTime = DateTime.Now
15                             };
16                             ulist1.Add(userInfor);
17                         }
18                         dbContext.BulkInsert(ulist1);
19                         int count2 = dbContext.T_UserInfor.Where(u => u.id.StartsWith("2")).BatchUpdate(a => new T_UserInfor() { id = a.id + "fsdfsdfsdfsfdsadfsadfsdfsfsafsfsdfsdfsdfsdf" });
20                         //統一提交
21                         transaction.Commit();
22                     }
23                     catch (Exception ex)
24                     {
25                         //using包裹不需要手寫rollback
26                         Console.WriteLine(ex.Message);
27                     }
28                 }

(4).相關配置

  可以配置的參數有:PreserveInsertOrder, SetOutputIdentity, BatchSize, NotifyAfter, BulkCopyTimeout, EnableStreaming, UseTempDB, TrackingEntities,UseOnlyDataTable, WithHoldlock, CalculateStats, StatsInfo, PropertiesToInclude, PropertiesToExclude, UpdateByProperties, SqlBulkCopyOptions . 根據自己的情況選擇使用吧

3.性能測試

      1000條    1w條    4w條      10w條

增加      0.7s     0.8s    1.2s左右     1.6s左右

條件修改                        1.2s左右

刪除                       1.9s左右

說明:其他不進行測試了,上述結果足可以看出來很快。

4.封裝到框架里面

  1 using EFCore.BulkExtensions;
  2 using Microsoft.EntityFrameworkCore;
  3 using System;
  4 using System.Collections.Generic;
  5 using System.Data.SqlClient;
  6 using System.Linq;
  7 using System.Linq.Expressions;
  8 using System.Reflection;
  9 using System.Text;
 10 using System.Threading.Tasks;
 11 using YpfCore.Data.Entity;
 12 using YpfCore.IService;
 13 using YpfCore.IService.BaseInterface;
 14 using YpfCore.Utils;
 15 using YpfCore.Utils.Extensions;
 16 
 17 namespace YpfCore.Service.BaseClass
 18 {
 19     /// <summary>
 20     /// 泛型方法,直接注入EF上下文
 21     /// </summary>
 22     public class BaseService : IBaseService, ISupport
 23     {
 24         public DbContext db;
 25 
 26         /// <summary>
 27         /// 在使用的時候,自動注入db上下文
 28         /// </summary>
 29         /// <param name="db"></param>
 30         public BaseService(CoreFrameDBContext db)
 31         {
 32             this.db = db;
 33 
 34             //關閉全局追蹤的代碼
 35             //db.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
 36         }
 37 
 38         /****************************************下面進行方法的封裝(同步)***********************************************/
 39         //1. 直接提交數據庫
 40 
 41         #region 01-數據源
 42         public IQueryable<T> Entities<T>() where T : class
 43         {
 44             return db.Set<T>();
 45         }
 46         #endregion
 47 
 48         #region 02-新增
 49         public int Add<T>(T model) where T : class
 50         {
 51             db.Entry(model).State = EntityState.Added;
 52             return db.SaveChanges();
 53 
 54         }
 55         #endregion
 56 
 57         #region 03-刪除
 58         /// <summary>
 59         /// 刪除
 60         /// </summary>
 61         /// <param name="model">需要刪除的實體</param>
 62         /// <returns></returns>
 63         public int Del<T>(T model) where T : class
 64         {
 65             db.Entry(model).State = EntityState.Deleted;
 66             return db.SaveChanges();
 67         }
 68         #endregion
 69 
 70         #region 04-根據條件刪除(支持批量刪除)
 71         /// <summary>
 72         /// 根據條件刪除(支持批量刪除)
 73         /// </summary>
 74         /// <param name="delWhere">傳入Lambda表達式(生成表達式目錄樹)</param>
 75         /// <returns></returns>
 76         public int DelBy<T>(Expression<Func<T, bool>> delWhere) where T : class
 77         {
 78             List<T> listDels = db.Set<T>().Where(delWhere).ToList();
 79             listDels.ForEach(model =>
 80             {
 81                 db.Entry(model).State = EntityState.Deleted;
 82             });
 83             return db.SaveChanges();
 84         }
 85         #endregion
 86 
 87         #region 05-單實體修改
 88         /// <summary>
 89         /// 修改
 90         /// </summary>
 91         /// <param name="model">修改后的實體</param>
 92         /// <returns></returns>
 93         public int Modify<T>(T model) where T : class
 94         {
 95             db.Entry(model).State = EntityState.Modified;
 96             return db.SaveChanges();
 97         }
 98         #endregion
 99 
100         #region 06-批量修改(非lambda)
101         /// <summary>
102         /// 批量修改(非lambda)
103         /// </summary>
104         /// <param name="model">要修改實體中 修改后的屬性 </param>
105         /// <param name="whereLambda">查詢實體的條件</param>
106         /// <param name="proNames">lambda的形式表示要修改的實體屬性名</param>
107         /// <returns></returns>
108         public int ModifyBy<T>(T model, Expression<Func<T, bool>> whereLambda, params string[] proNames) where T : class
109         {
110             List<T> listModifes = db.Set<T>().Where(whereLambda).ToList();
111             Type t = typeof(T);
112             List<PropertyInfo> proInfos = t.GetProperties(BindingFlags.Instance | BindingFlags.Public).ToList();
113             Dictionary<string, PropertyInfo> dicPros = new Dictionary<string, PropertyInfo>();
114             proInfos.ForEach(p =>
115             {
116                 if (proNames.Contains(p.Name))
117                 {
118                     dicPros.Add(p.Name, p);
119                 }
120             });
121             foreach (string proName in proNames)
122             {
123                 if (dicPros.ContainsKey(proName))
124                 {
125                     PropertyInfo proInfo = dicPros[proName];
126                     object newValue = proInfo.GetValue(model, null);
127                     foreach (T m in listModifes)
128                     {
129                         proInfo.SetValue(m, newValue, null);
130                     }
131                 }
132             }
133             return db.SaveChanges();
134         }
135         #endregion
136 
137         #region 07-根據條件查詢
138         /// <summary>
139         /// 根據條件查詢
140         /// </summary>
141         /// <param name="whereLambda">查詢條件(lambda表達式的形式生成表達式目錄樹)</param>
142         /// <returns></returns>
143         public List<T> GetListBy<T>(Expression<Func<T, bool>> whereLambda) where T : class
144         {
145             return db.Set<T>().Where(whereLambda).ToList();
146         }
147         #endregion
148 
149         #region 08-根據條件排序和查詢
150         /// <summary>
151         /// 根據條件排序和查詢
152         /// </summary>
153         /// <typeparam name="Tkey">排序字段類型</typeparam>
154         /// <param name="whereLambda">查詢條件</param>
155         /// <param name="orderLambda">排序條件</param>
156         /// <param name="isAsc">升序or降序</param>
157         /// <returns></returns>
158         public List<T> GetListBy<T, Tkey>(Expression<Func<T, bool>> whereLambda, Expression<Func<T, Tkey>> orderLambda, bool isAsc = true) where T : class
159         {
160             List<T> list = null;
161             if (isAsc)
162             {
163                 list = db.Set<T>().Where(whereLambda).OrderBy(orderLambda).ToList();
164             }
165             else
166             {
167                 list = db.Set<T>().Where(whereLambda).OrderByDescending(orderLambda).ToList();
168             }
169             return list;
170         }
171         #endregion
172 
173         #region 09-分頁查詢(根據Lambda排序)
174         /// <summary>
175         /// 根據條件排序和查詢
176         /// </summary>
177         /// <typeparam name="Tkey">排序字段類型</typeparam>
178         /// <param name="pageIndex">頁碼</param>
179         /// <param name="pageSize">頁容量</param>
180         /// <param name="whereLambda">查詢條件</param>
181         /// <param name="orderLambda">排序條件</param>
182         /// <param name="isAsc">升序or降序</param>
183         /// <returns></returns>
184         public List<T> GetPageList<T, Tkey>(int pageIndex, int pageSize, Expression<Func<T, bool>> whereLambda, Expression<Func<T, Tkey>> orderLambda, bool isAsc = true) where T : class
185         {
186 
187             List<T> list = null;
188             if (isAsc)
189             {
190                 list = db.Set<T>().Where(whereLambda).OrderBy(orderLambda)
191                .Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();
192             }
193             else
194             {
195                 list = db.Set<T>().Where(whereLambda).OrderByDescending(orderLambda)
196               .Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();
197             }
198             return list;
199         }
200         #endregion
201 
202         #region 10-分頁查詢(根據名稱排序)
203         /// <summary>
204         /// 分頁查詢輸出總行數(根據名稱排序)
205         /// </summary>
206         /// <param name="pageIndex">頁碼</param>
207         /// <param name="rowCount">輸出的總數量</param>
208         /// <param name="whereLambda">查詢條件</param>
209         /// <param name="sortName">排序名稱</param>
210         /// <param name="sortDirection">asc 或 desc</param>
211         /// <returns></returns>
212         public List<T> GetPageListByName<T>(int pageIndex, int pageSize, Expression<Func<T, bool>> whereLambda, string sortName, string sortDirection) where T : class
213         {
214 
215             List<T> list = db.Set<T>().Where(whereLambda).DataSorting(sortName, sortDirection)
216                  .Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();
217             return list;
218         }
219         #endregion
220 
221         #region 11-分頁查詢輸出總行數(根據Lambda排序)
222         /// <summary>
223         /// 根據條件排序和查詢
224         /// </summary>
225         /// <typeparam name="Tkey">排序字段類型</typeparam>
226         /// <param name="pageIndex">頁碼</param>
227         /// <param name="pageSize">頁容量</param>
228         /// <param name="whereLambda">查詢條件</param>
229         /// <param name="orderLambda">排序條件</param>
230         /// <param name="isAsc">升序or降序</param>
231         /// <returns></returns>
232         public List<T> GetPageList<T, Tkey>(int pageIndex, int pageSize, out int rowCount, Expression<Func<T, bool>> whereLambda, Expression<Func<T, Tkey>> orderLambda, bool isAsc = true) where T : class
233         {
234             int count = 0;
235             List<T> list = null;
236             count = db.Set<T>().Where(whereLambda).Count();
237             if (isAsc)
238             {
239                 var iQueryList = db.Set<T>().Where(whereLambda).OrderBy(orderLambda)
240                    .Skip((pageIndex - 1) * pageSize).Take(pageSize);
241 
242                 list = iQueryList.ToList();
243             }
244             else
245             {
246                 var iQueryList = db.Set<T>().Where(whereLambda).OrderByDescending(orderLambda)
247                  .Skip((pageIndex - 1) * pageSize).Take(pageSize);
248                 list = iQueryList.ToList();
249             }
250             rowCount = count;
251             return list;
252         }
253         #endregion
254 
255         #region 12-分頁查詢輸出總行數(根據名稱排序)
256         /// <summary>
257         /// 分頁查詢輸出總行數(根據名稱排序)
258         /// </summary>
259         /// <param name="pageIndex">頁碼</param>
260         /// <param name="pageSize">頁容量</param>
261         /// <param name="rowCount">輸出的總數量</param>
262         /// <param name="whereLambda">查詢條件</param>
263         /// <param name="sortName">排序名稱</param>
264         /// <param name="sortDirection">asc 或 desc</param>
265         /// <returns></returns>
266         public List<T> GetPageListByName<T>(int pageIndex, int pageSize, out int rowCount, Expression<Func<T, bool>> whereLambda, string sortName, string sortDirection) where T : class
267         {
268             int count = 0;
269             count = db.Set<T>().Where(whereLambda).Count();
270 
271             List<T> list = db.Set<T>().Where(whereLambda).DataSorting(sortName, sortDirection)
272                  .Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();
273 
274             rowCount = count;
275             return list;
276         }
277         #endregion
278 
279 
280         //2. SaveChange剝離出來,處理事務
281 
282         #region 01-批量處理SaveChange()
283         /// <summary>
284         /// 事務批量處理
285         /// </summary>
286         /// <returns></returns>
287         public int SaveChange()
288         {
289             return db.SaveChanges();
290         }
291         #endregion
292 
293         #region 02-新增
294         /// <summary>
295         /// 新增
296         /// </summary>
297         /// <param name="model">需要新增的實體</param>
298         public void AddNo<T>(T model) where T : class
299         {
300             db.Entry(model).State = EntityState.Added;
301         }
302         #endregion
303 
304         #region 03-刪除
305         /// <summary>
306         /// 刪除
307         /// </summary>
308         /// <param name="model">需要刪除的實體</param>
309         public void DelNo<T>(T model) where T : class
310         {
311             db.Entry(model).State = EntityState.Deleted;
312         }
313         #endregion
314 
315         #region 04-根據條件刪除
316         /// <summary>
317         /// 條件刪除
318         /// </summary>
319         /// <param name="delWhere">需要刪除的條件</param>
320         public void DelByNo<T>(Expression<Func<T, bool>> delWhere) where T : class
321         {
322             List<T> listDels = db.Set<T>().Where(delWhere).ToList();
323             listDels.ForEach(model =>
324             {
325                 db.Entry(model).State = EntityState.Deleted;
326             });
327         }
328         #endregion
329 
330         #region 05-修改
331         /// <summary>
332         /// 修改
333         /// </summary>
334         /// <param name="model">修改后的實體</param>
335         public void ModifyNo<T>(T model) where T : class
336         {
337             db.Entry(model).State = EntityState.Modified;
338         }
339         #endregion
340 
341 
342         //3. EF調用sql語句
343 
344         #region 01-執行增加,刪除,修改操作(或調用相關存儲過程)
345         /// <summary>
346         /// 執行增加,刪除,修改操作(或調用存儲過程)
347         /// </summary>
348         /// <param name="sql"></param>
349         /// <param name="pars"></param>
350         /// <returns></returns>
351         public int ExecuteSql(string sql, params SqlParameter[] pars)
352         {
353             return db.Database.ExecuteSqlRaw(sql, pars);
354         }
355 
356         #endregion
357 
358         #region 02-執行查詢操作(調用查詢類的存儲過程)
359         /// <summary>
360         /// 執行查詢操作
361         /// 注:查詢必須返回實體的所有屬性字段;結果集中列名必須與屬性映射的項目匹配;查詢中不能包含關聯數據
362         /// 除Select以外其他的SQL語句無法執行
363         /// </summary>
364         /// <typeparam name="T"></typeparam>
365         /// <param name="sql"></param>
366         /// <param name="isTrack">是否跟蹤狀態,默認是跟蹤的</param>
367         /// <param name="pars"></param>
368         /// <returns></returns>
369         public List<T> ExecuteQuery<T>(string sql, bool isTrack = true, params SqlParameter[] pars) where T : class
370         {
371             if (isTrack)
372             {
373                 //表示跟蹤狀態(默認是跟蹤的)
374                 return db.Set<T>().FromSqlRaw(sql, pars).ToList();
375             }
376             else
377             {
378                 //表示不跟蹤狀態
379                 return db.Set<T>().FromSqlRaw(sql, pars).AsNoTracking().ToList();
380             }
381         }
382         #endregion
383 
384         #region 03-執行查詢操作(與Linq相結合)
385         /// <summary>
386         /// 執行查詢操作
387         /// 注:查詢必須返回實體的所有屬性字段;結果集中列名必須與屬性映射的項目匹配;查詢中不能包含關聯數據
388         /// 除Select以外其他的SQL語句無法執行
389         /// </summary>
390         /// <typeparam name="T"></typeparam>
391         /// <param name="sql"></param>
392         ///  <param name="whereLambda">查詢條件</param>
393         /// <param name="isTrack">是否跟蹤狀態,默認是跟蹤的</param>
394         /// <param name="pars"></param>
395         /// <returns></returns>
396         public List<T> ExecuteQueryWhere<T>(string sql, Expression<Func<T, bool>> whereLambda, bool isTrack = true, params SqlParameter[] pars) where T : class
397         {
398             if (isTrack)
399             {
400                 //表示跟蹤狀態(默認是跟蹤的)
401                 return db.Set<T>().FromSqlRaw(sql, pars).Where(whereLambda).ToList();
402             }
403             else
404             {
405                 //表示不跟蹤狀態
406                 return db.Set<T>().FromSqlRaw(sql, pars).Where(whereLambda).AsNoTracking().ToList();
407             }
408         }
409         #endregion
410 
411 
412         /****************************************下面進行方法的封裝(異步)***********************************************/
413         //1. 直接提交數據庫
414 
415         #region 01-新增
416         public async Task<int> AddAsync<T>(T model) where T : class
417         {
418             await db.AddAsync(model);
419             return await db.SaveChangesAsync();
420 
421         }
422         #endregion
423 
424         #region 02-刪除
425         /// <summary>
426         /// 刪除
427         /// </summary>
428         /// <param name="model">需要刪除的實體</param>
429         /// <returns></returns>
430         public async Task<int> DelAsync<T>(T model) where T : class
431         {
432             db.Entry(model).State = EntityState.Deleted;
433             return await db.SaveChangesAsync();
434         }
435         #endregion
436 
437         #region 03-根據條件刪除(支持批量刪除)
438         /// <summary>
439         /// 根據條件刪除(支持批量刪除)
440         /// </summary>
441         /// <param name="delWhere">傳入Lambda表達式(生成表達式目錄樹)</param>
442         /// <returns></returns>
443         public async Task<int> DelByAsync<T>(Expression<Func<T, bool>> delWhere) where T : class
444         {
445             List<T> listDels = db.Set<T>().Where(delWhere).ToList();
446             listDels.ForEach(model =>
447             {
448                 db.Entry(model).State = EntityState.Deleted;
449             });
450             return await db.SaveChangesAsync();
451         }
452         #endregion
453 
454         #region 04-單實體修改
455         /// <summary>
456         /// 修改
457         /// </summary>
458         /// <param name="model">修改后的實體</param>
459         /// <returns></returns>
460         public async Task<int> ModifyAsync<T>(T model) where T : class
461         {
462 
463             db.Entry(model).State = EntityState.Modified;
464             return await db.SaveChangesAsync();
465         }
466         #endregion
467 
468 
469         //2. SaveChange剝離出來,處理事務
470 
471         #region 01-批量處理SaveChange()
472         /// <summary>
473         /// 事務批量處理
474         /// </summary>
475         /// <returns></returns>
476         public async Task<int> SaveChangeAsync()
477         {
478             return await db.SaveChangesAsync();
479         }
480         #endregion
481 
482         #region 02-新增
483         /// <summary>
484         /// 新增
485         /// </summary>
486         /// <param name="model">需要新增的實體</param>
487         public async void AddNoAsync<T>(T model) where T : class
488         {
489             await db.AddAsync(model);
490         }
491         #endregion
492 
493 
494         //3. EF調用sql語句
495 
496         #region 01-執行增加,刪除,修改操作(或調用存儲過程)
497         /// <summary>
498         /// 執行增加,刪除,修改操作(或調用存儲過程)
499         /// </summary>
500         /// <param name="sql"></param>
501         /// <param name="pars"></param>
502         /// <returns></returns>
503         public async Task<int> ExecuteSqlAsync(string sql, params SqlParameter[] pars)
504         {
505             return await db.Database.ExecuteSqlRawAsync(sql, pars);
506         }
507         #endregion
508 
509 
510         /****************************************下面是基於【EFCore.BulkExtensions】大數據的處理***********************************************/
511 
512         #region 01-增加
513         /// <summary>
514         /// 增加
515         /// </summary>
516         /// <typeparam name="T"></typeparam>
517         /// <param name="list"></param>
518         public void BulkInsert<T>(List<T> list) where T : class
519         {
520             db.BulkInsert<T>(list);
521         }
522         #endregion
523 
524         #region 02-修改
525         /// <summary>
526         /// 修改
527         /// PS:傳入的實體如果不賦值,則更新為null,即傳入的實體每個字段都要有值
528         /// </summary>
529         /// <typeparam name="T"></typeparam>
530         /// <param name="list"></param>
531         public void BulkUpdate<T>(List<T> list) where T : class
532         {
533             db.BulkUpdate<T>(list);
534         }
535         #endregion
536 
537         #region 03-刪除
538         /// <summary>
539         /// 刪除
540         /// PS:傳入的list中的實體僅需要主鍵有值,它是根據主鍵刪除的
541         /// </summary>
542         /// <typeparam name="T"></typeparam>
543         /// <param name="list"></param>
544         public void BulkDelete<T>(List<T> list) where T : class
545         {
546             db.BulkDelete<T>(list);
547         }
548         #endregion
549 
550         #region 04-條件刪除
551         /// <summary>
552         /// 條件刪除
553         /// </summary>
554         /// <param name="delWhere">需要刪除的條件</param>
555         public int BatchDelete<T>(Expression<Func<T, bool>> delWhere) where T : class
556         {
557             return db.Set<T>().Where(delWhere).BatchDelete();
558         }
559         #endregion
560 
561         #region 05-條件更新1
562         /// <summary>
563         /// 條件更新
564         /// PS:要更新哪幾個字段,就給傳入的實體中的哪幾個字段賦值
565         /// </summary>
566         /// <param name="delWhere">需要更新的條件</param>
567         /// <param name="model">更新為的實體</param>
568         public int BatchUpdate<T>(Expression<Func<T, bool>> delWhere, T model) where T : class, new()
569         {
570             return db.Set<T>().Where(delWhere).BatchUpdate<T>(model);
571         }
572         #endregion
573 
574         #region 06-條件更新2
575         /// <summary>
576         /// 條件更新
577         /// PS:要更新哪幾個字段,就給傳入的實體中的哪幾個字段賦值
578         /// </summary>
579         /// <param name="delWhere">需要更新的條件</param>
580         /// <param name="model">更新為的實體</param>
581         public int BatchUpdate2<T>(Expression<Func<T, bool>> delWhere, Expression<Func<T, T>> modelWhere) where T : class, new()
582         {
583             return db.Set<T>().Where(delWhere).BatchUpdate<T>(modelWhere);
584         } 
585         #endregion
586 
587 
588 
589     }
590 }
View Code

 

 

 

 

 

 

 

!

  • 作       者 : Yaopengfei(姚鵬飛)
  • 博客地址 : http://www.cnblogs.com/yaopengfei/
  • 聲     明1 : 本人才疏學淺,用郭德綱的話說“我是一個小學生”,如有錯誤,歡迎討論,請勿謾罵^_^。
  • 聲     明2 : 原創博客請在轉載時保留原文鏈接或在文章開頭加上本人博客地址,否則保留追究法律責任的權利。
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM