少数のテーブルがあり、ユーザーに属するデータがそれほど多くない場合は、LINQ to SQL でコマンドを発行できます。「あまりない」とは、ログイン情報、アドレス情報、設定など、ほとんど変更されないいくつかのレコードを意味します。理想的には、このすべてのロジックをまとめて、ステップが常に意図した順序で実行されるようにする必要があります。この場合でも、ストアド プロシージャを使用できます。
一方、複数の投稿、コメント、お気に入り、ブックマークなどを持つフォーラム ユーザーなど、データが大量になることが予想される場合は、ユーザーの ID を取得して残りを次のように処理するストアド プロシージャを使用することをお勧めします。必要です。問題は、一致するレコードごとに単一の削除ステートメントが発行されることです。これが、1 つのステートメントでユーザー ID に関連付けられたすべてのレコードを削除する delete ステートメントよりもパフォーマンスが低下する原因です。
オプション #1: ストアド プロシージャを使用する
ストアド プロシージャを DataContext にマップすると、それを として使用できるようになりますdc.DeleteUserAccount(userId)
。Scott Gu の優れたブログ記事が、次のブログ記事に掲載されています。LINQ to SQL (パート 6 - ストアド プロシージャを使用したデータの取得)
オプション #2: Terry Aney のバッチ更新コードを使用する
Terry Aney は、効率的な方法で LINQ to SQL を使用して一括更新および削除する機能を開発した彼の経験について説明している素晴らしいブログ記事を投稿しています。一致するレコードごとに単一の update/delete ステートメントを生成する代わりに、コードは通常の方法ですべてのレコードに対して単一のステートメントを生成します。投稿とコードは次の場所にあります: Batch Updates and Deletes with LINQ to SQL。
オプション #3: DataContext.ExecuteCommand メソッドを使用する
DataContext.ExecuteCommand メソッドを使用して、次のように SQL を直接実行できます。
int affectedRecords =
dc.ExecuteCommand("Update Person SET FirstName = {0} WHERE FirstName = {1}", "Foo", "Bar");
入力をパラメータ化できる{0}
andの使用に注意してください。{1}
連結の代わりにこれを使用して、SQL インジェクション攻撃を防ぎます。
これを使用する場合は、オプション #1 を使用することもできます。