2011年01月30日

LINQ to SQL番外編 - 挿入、更新、削除の動作のカスタマイズ

   このエントリーをはてなブックマークに追加 Clip to Evernote
まず、LINQ to SQLで更新を行った時に、どのようなSQLが発行されているのか、
以下のコードで見てみましょう。


発行されるSQLは、


となります。
SQL の SETで設定されるカラムは、ContactTitleだけです。これからわかるのは、
どのカラムの値が変更されたかで、発行されるSQLが異なるということです。
つまり、動的にSQL文を組み立てているのです。

なかなかすごいことをやっているなと思うのですが、動的にSQLを組み立てること
があだになり、一度に大量のデータを更新するような場合は、SQLの組み立てに
時間がかかり、速度低下が起こる可能性もあります。これは、実際に試していない
ので、僕の想像の域を脱しませんが...

この時に、独自のSQLが使えれば、速度向上につながるかもしれません。
また、あるカラムは更新させたくないといった場合も、独自のSQLが使えれば便利です。

LINQ to SQLは、そのような要望に応えられるよう、Delete, Insert, Update を
既定のものから、別のものに置き換えることができます。
ただし、置き換え後のものは、ストアドプロシージャのみとなります。

では、さっそく、Updateのカスタマイズをやってみましょう。
まず、以下のようなストアドプロシージャを作成します。


このストアドプロシージャだと楽観的同時実行制御が行えませんが、
Updateをカスタマイズする方法を示すことが目的なので、そこは大目にみてください。

サーバーエクスプローラの[ストアドプロシージャ]のフォルダを右クリックし、
[新しいストアドプロシージャの追加]を選ぶと、エディタ部にひな形が表示されますので、
それを上記のストアドプロシージャの記述に変更します。
[保存]ボタンを押し、ストアドプロシージャを Northwindデータベースに追加します。

追加されたストアドプロシージャを Northwind.dbml の O/Rデザイナー画面の空白部にD&Dします。
すると、Northwind.dbmlにストアドプロシージャに対応するメソッドが追加されます。

O/RデザイナーのCustomers クラスをクリックし、プロパティウィンドウに、
Customersデータクラスのプロパティを表示します。
Update プロパティに、先ほど作成した UpdateCustomer メソッドを割り当てます。

以上で、Updateメソッドのカスタマイズが完了しました。

これで最初に示したコードを実行すると、


というSQLが発行されているのがわかります。

なお、


と Cityカラムを更新しようとしても、ストアドプロシージャには、この値はわたりませんので、
Cityカラムは更新されることはありません。

同様の方法で、Insert, Delete もカスタマイズすることが可能です。


LINQ to SQL番外編とは
メールマガジン『C#プログラミングレッスン』で連載した「LINQ to SQL編」には書ききれなかった情報を
「番外編」としてブログにアップしています。
併せて、メールマガジン『C#プログラミングレッスン - Linq to SQL編』も読んでいただけると、
より理解が深まると思います。
バックナンバーは、メールマガジン『C#プログラミングレッスン』書庫のページからダウンロードできます。



 

この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/gushwell/52118833