批量删除的正确写法

错误写法(性能低)

public string DeleteAll()
{
    var str = "";
    var models = _db.XXXXXXes.Where(r => r.lx == 1 && r.zt == 0).ToList();
    if (models.Count <= 0)
    {
        str = "找不到要删除的记录";
    }
    else
    {
        models.ForEach(m => _db.XXXXXXes.DeleteOnSubmit(m));
    }
    _db.SubmitChanges();
    return str;
}Code language: JavaScript (javascript)

问题:ToList() 先把所有符合条件的记录从数据库读取到内存,再逐条 DeleteOnSubmit,最后 SubmitChanges 时逐条生成 DELETE 语句。数据量大时既耗内存又耗时间。


正确写法(直接用 IQueryable)

public string DeleteAll()
{
    var str = "";
    try
    {
        var models = _db.XXXXXXes.Where(r => r.lx == 1 && r.zt == 0);
        _db.XXXXXXes.DeleteAllOnSubmit(models);
        _db.SubmitChanges();
    }
    catch (Exception ex)
    {
        str = ex.Message;
    }
    return str;
}Code language: PHP (php)

要点:Where 返回的是 IQueryable,不会立即查库。DeleteAllOnSubmit 接收 IQueryable 后,SubmitChanges 时直接生成一条 DELETE 语句在数据库端执行,不需要逐条读取再逐条删除。

生成的 SQL 类似:

DELETE FROM [XXXXXX]
WHERE ([lx] = 1) AND ([zt] = 0)

两种写法对比

对比项错误写法(ToList + DeleteOnSubmit)正确写法(DeleteAllOnSubmit + IQueryable)
查库次数1 次 SELECT 全量读取不读取,直接 DELETE
DELETE 语句逐条生成 N 条 DELETE1 条 DELETE
内存占用高(全部实体加载到内存)低(无实体加载)
数据量大时很慢很快

记住:​ 批量删除/更新时,永远不要先 ToList() 再逐条操作。保持 IQueryable,让数据库一次性完成。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注