EFCore+Linq高效批量删除包含图片及大文本的数据两种性能对比|C/S开发框架
作者:csframework|C/S框架网  发布日期:2024/10/20 11:47:38

EFCore+Linq高效批量删除包含图片及大文本的数据两种性能对比|C/S开发框架

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);
        }
    }

C/S框架网|原创精神.创造价值.打造精品


扫一扫加作者微信
C/S框架网作者微信 C/S框架网|原创作品.质量保障.竭诚为您服务
上一篇 下一篇