質問: true`と言う良い方法はありません。 しかし、私は削除する行のPK値を知っています。だから`delete from myTable where Id in @listToDelete`たい 問題は、私のサーバーが6分でもダウンした場合、削除する行が2100を超えていることです。 Dapperは@listToDeleteを引数にとり、それぞれをパラメータに変換するので、deleteへの呼び出しは失敗します。 (私のデータ消去をさらに遅らせる原因となる) Dapperでこれを処理する最善の方法は何ですか? 注:私は提出値のパラメータを見てきましたが、私が見ることができるものから、彼らは非常にではありませんパフォーマンス 。私の建築のこの部分は私のシステムのボトルネックです。私は非常**に**速くする必要があります。
回答: 1つの選択肢は、サーバー上に一時テーブルを作成し、バルクロード機能を使用してすべてのIDを一度にそのテーブルにアップロードすることです。次に、結合、EXISTSまたはIN句を使用して、一時表にアップロードしたレコードのみを削除します。 バルクロードはSQL Serverの最適化されたパスであり、非常に高速でなければなりません。 例えば: 1. `CREATE TABLE #RowsToDelete(ID INT PRIMARY KEY)`ステートメントを実行して、 2. `#RowsToDelete`一括読み込みを使用してキーを挿入する 3. `DELETE FROM myTable where Id IN (SELECT ID FROM #RowsToDelete)`実行し`DELETE FROM myTable where Id IN (SELECT ID FROM #RowsToDelete)` 4. `DROP TABLE #RowsToDelte`実行します(セッションを閉じるとテーブルも自動的に削除されます) (Dapperを前提とする)コード例: ``` conn.Open(); var columnName = "ID"; conn.Execute(string.Format("CREATE TABLE #{0}s({0} INT PRIMARY KEY)", columnName)); using (var bulkCopy = new SqlBulkCopy(conn)) { bulkCopy.BatchSize = ids.Count; bulkCopy.DestinationTableName = string.Format("#{0}s", columnName); var table = new DataTable(); table.Columns.Add(columnName, typeof (int)); bulkCopy.ColumnMappings.Add(columnName, columnName); foreach (var id in ids) { table.Rows.Add(id); } bulkCopy.WriteToServer(table); } //or do other things with your table instead of deleting here conn.Execute(string.Format(@"DELETE FROM myTable where Id IN (SELECT {0} FROM #{0}s", columnName)); conn.Execute(string.Format("DROP TABLE #{0}s", columnName)); ```