2016-03-29 5 views
4

クラスタ化インデックスで約5000行のテーブルを削除していますが、EFはそれを実行するのに約30秒かかります。生成されたSQLのログEntityFramework 6.0は、行ごとに1つのDELETEを生成します。

は、1つが、すべての行の削除やっている示しています

DELETE [dbo].[Table] 
WHERE ([ColumnID] = @0) 

だから、合計で5000件の取引があります。

バッチでSaveChanges()を呼び出そうとしましたが、これはパフォーマンスを大幅に向上させたり、上記の動作を変更していません。

//loop 
{ 
    //get batch 
    db.Table.RemoveRange(batch); 
    db.SaveChanges(); 
} 

私は、行ごとに実行し削除コマンドのこの欠陥を指摘するいくつかの他の質問を見てきましたが、何の提案は、その後行われません。

は1コマンドあたりの実行EFを停止する方法はあります行?可能であればインラインSQLを避けたいと思います。

答えて

10

不幸にも、これはRemoveRangeメソッドの通常の動作です。詳細については、postの回答を参照してください(引用符で囲んだテキストをチェックしてください)。

オプションを使用すると、1回のラウンドトリップで行を削除するバッチを作成することができますEntityFramework Extended Library nugetパッケージ、使用している可能性の一つ:あなたが他のサードパーティのライブラリを使用したくない場合は、常に、

//delete all rows where FirstName matches 
db.Table 
.Where(u => u.FirstName == "firstname")// just an example 
.Delete(); 

を生のSQLステートメントを実行するオプションがある:

db.ExecuteStoreCommand("DELETE FROM Table WHERE FirstName = {0}", firstname); 

しかし、私はあなたが最初の解決策を追求していると思う。

+0

私はEntityFramework拡張ライブラリに関するいくつかの否定的なフィードバックを聞いたことがありますが、これを行ってしまえば、それはほんとうに高速でした。 私の場合、少なくとも - それは素晴らしい叫び声です! – FBryant87

関連する問題