我正在使用在这个问题的答案中找到的 BatchDelete:EF Code First Delete Batch From IQueryable<T>?
该方法似乎浪费了太多时间从 IQueryable 构建删除子句。具体来说,使用下面的 IQueryable 删除 20.000 个元素需要将近两分钟。
context.DeleteBatch(context.SomeTable.Where(x => idList.Contains(x.Id)));
所有的时间都花在这条线上:
var sql = clause.ToString();
该行是此方法的一部分,可在上面链接的原始问题中找到,但为方便起见粘贴在这里:
private static string GetClause<T>(DbContext context, IQueryable<T> clause) where T : class
{
const string Snippet = "FROM [dbo].[";
var sql = clause.ToString();
var sqlFirstPart = sql.Substring(sql.IndexOf(Snippet, System.StringComparison.OrdinalIgnoreCase));
sqlFirstPart = sqlFirstPart.Replace("AS [Extent1]", string.Empty);
sqlFirstPart = sqlFirstPart.Replace("[Extent1].", string.Empty);
return sqlFirstPart;
}
我想context.SomeTable.Where(x => idList.Contains(x.Id))
编译查询可能会有所帮助,但是AFAIK在EF 5上使用DbContext时无法编译查询。在论文中它们应该被缓存,但我看不到第二次执行同一个BatchDelete的迹象。
有没有办法让它更快?我想避免手动构建 SQL 删除语句。