EF6 批量更新刪除資料
阿新 • • 發佈:2018-12-21
首先看改進前的版本以批量更新為例:
[Obsolete] public void DeleteRoleUser2(string roleId) { IRepository<UserEntity> userRepo = RepositoryFactory<UserEntity>.Create(); IEnumerable<UserEntity> users = userRepo.FindList(x => x.F_RoleId.Equals(roleId)); foreach (var u in users) { u.F_RoleId = null; } userRepo.Update(users, x => x.F_RoleId); }
通過miniprofiler檢測可以看到:
資料庫執行先查詢,後多次update 的SQL 操作,耗時84.9ms, 本可以一行update sql 執行的功能卻分開成了多次sql執行,效率受到影響。
下面看使用EF-plus的做法,不要用EntityFramework.Extended,會報異常:未能從程式集“EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”中載入型別“System.Data.Entity.Core.Mapping.EntityContainerMapping”。且這個Extneded GitHub上明確提示2015年後就不再維護了。
推薦使用 https://entityframework-plus.net/:
改進後的批量更新程式碼如下:
IRepository<UserEntity> userRepo = RepositoryFactory<UserEntity>.Create(); Expression<Func<UserEntity, bool>> express = x => x.F_RoleId.Equals(roleId); userRepo.Update(express, u => new UserEntity() { F_RoleId= null }); public int Update<T>(Expression<Func<T, bool>> condition, Expression<Func<T, T>> updateExpression) where T : class, new() { IQueryable<T> query = dbcontext.Set<T>().Where(condition); return query.Update<T>(updateExpression); }
執行同樣的操作,且都是執行後非首次執行比較測試,發現EF plus 效率上要快2~3倍的樣子,值得推薦使用。<完>