1. 程式人生 > >EF6 批量更新刪除資料

EF6 批量更新刪除資料

首先看改進前的版本以批量更新為例:

[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倍的樣子,值得推薦使用。<完>