この質問への回答にある BatchDelete を使用しています: EF Code First Delete Batch From IQueryable<T>?
このメソッドは、IQueryable から削除句を作成するのに時間がかかりすぎているようです。具体的には、以下の IQueryable を使用して 20.000 要素を削除するには、ほぼ 2 分かかります。
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 の 2 回目の実行で改善の兆候は見られません。
これをより速くする方法はありますか?SQL 削除ステートメントを手動で作成することは避けたいと思います。