EFCore+Linq高效批量删除包含图片及大文本的数据两种性能对比
EFCore+Linq高效批量删除包含图片及大文本的数据两种性能对比
目录
测试条件
使用两种方法分别删除5条数据,每条数据大概7MB。
方式一:使用DbContext的RemoveRange()方法
C# 全选
public bool DeletePackageByKeys(List<string> listKeys)
{
var q = _Database.GetQueryable<sys_UpgraderPackageTable>().Where(w => listKeys.Contains(w.isid));
_Database.RemoveRange(q);
var count = _Database.SaveChanges();
return count > 0;
}
测试结果:1~3s,实体对象越多,效率越低!
方式二:使用仅包含key属性的实体类 (推荐使用)
C# 全选
/// <summary>
/// EFCore高效批量删除包含图片及大文本的数据
/// </summary>
/// <param name="listKeys">实体类主键:isid</param>
/// <returns></returns>
public bool DeletePackageByKeys(List<string> listKeys)
{
//isid是主键,构建一个仅包含key属性的实体类列表
var list = listKeys.Select(key => new sys_UpgraderPackageTable { isid = key }).ToList();
_Database.RemoveRange(list);
var count = _Database.SaveChanges();
return count > 0;
}
测试结果:毫秒级删除资料!
反编译DbContext.RemoveRange方法的代码
原来是循环实体对象删除的,如果实体对象包含大图片或大文本,先从数据库获取下来,然后删除。
C# 全选
public virtual void RemoveRange(IEnumerable<object> entities)
{
Microsoft.EntityFrameworkCore.Utilities.Check.NotNull(entities, "entities");
CheckDisposed();
IStateManager stateManager = DbContextDependencies.StateManager;
foreach (object entity in entities)
{
InternalEntityEntry orCreateEntry = stateManager.GetOrCreateEntry(entity);
EntityState entityState = orCreateEntry.EntityState;
if (entityState == EntityState.Detached)
{
SetEntityState(orCreateEntry, EntityState.Unchanged);
}
orCreateEntry.SetEntityState((entityState != EntityState.Added) ? EntityState.Deleted : EntityState.Detached);
}
}
版权声明:本文为开发框架文库发布内容,转载请附上原文出处连接
NewDoc C/S框架网