错误写法(性能低)
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 条 DELETE | 1 条 DELETE |
| 内存占用 | 高(全部实体加载到内存) | 低(无实体加载) |
| 数据量大时 | 很慢 | 很快 |
记住: 批量删除/更新时,永远不要先
ToList()再逐条操作。保持IQueryable,让数据库一次性完成。
Previous: 排序和多列排序
Next: 表关联使用拼接字符串的