6

Linq to SQL を使用してデータベースにアクセスしています。特定のユーザーに属するすべてのテーブルのすべてのレコードを基本的に削除する「アカウントの削除」機能が必要です。これを行う最も効率的な方法は何でしょうか?

削除は特定の順序で行う必要があります。そうしないと、外部キーの整合性エラーが発生します。これはデータベースから手動で行うことができます。私の推測では、L2S などでそれを単純にエミュレートすることになります (疑似コード)。

var tb1del = From Table1 Where userId == userIdToDelete;
mydatacontext.Table1.deleteonsubmit(tb1del);

var tb1de2 = From Table1 Where userId == userIdToDelete;
mydatacontext.Table2.deleteonsubmit(tb1de2);
...

ただし、それがレコードを削除する最も効率的な方法ではないことは確かです。

4

3 に答える 3

6

最も簡単な解決策は、データベースにFOREIGN KEY制約を作成することです。ON DELETE CASCADEそうすれば、削除の順序などを気にする必要がありません。アカウントレコードを削除するだけで完了です。

于 2010-03-03T03:20:51.527 に答える
2

Aaronaughtは正しいですが、Microsoft SQL Server Management Studioでこれを行う方法を知りたい方のために、これを行う場所を説明するスクリーンショットを添付しました。

目的のテーブルを右クリックし、Relationshipsボタンをクリックして、関係の1つをクリックし、INSERT And UPDATE Spesification下を展開しTable designerます。

次に、Delete rule=Cascadeを選択すると完了です。このテーブルからレコードを削除するたびに、カスケードを選択したすべての外部キー項目も削除されます。

代替テキスト

于 2010-09-22T12:22:02.793 に答える
2

少数のテーブルがあり、ユーザーに属するデータがそれほど多くない場合は、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 を使用することもできます。

于 2010-03-03T02:11:55.447 に答える