2011年02月03日

LINQ to SQL番外編 - SelectWithUpdlock メソッドを自作

   このエントリーをはてなブックマークに追加 Clip to Evernote
LINQ to SQLでは、UPDLOCK付きの SQL文を発行させることができません。
以下のように書ければ良いのですが...
このような場合は、しかたないので、ExecuteQueryを使います。
これで、UPDLOCK付きのSELECT文を発行できます。

ただ、こういったSQLは、ストアドプロシージャを使う方が良いかな、と個人的には思います。
このあたり、LINQ to SQLの経験豊富な方の意見を聞いてみたいものです。

しかし、いちいちSQL文を手書きするのはイヤですよね。
ちょっと工夫してみましょう。

こんなメソッドを作ってみました。
このメソッドを使うコードは、こんな感じです。
※ 拡張メソッドにすれば、もっと使いやすくなりますね。

SelectWithUpdlockが、何をやっているかというと、
で、queryの実際のSQL文を文字列として取り出しています。
次に、
で、SQL文の FORM句の後ろに、"WITH (UPDLOCK)" という文字列を追加した、SQL文を作ります。
3行目の
ですが、Parametersに入っているパラメータの値を、配列に変換しています。
まず、Castメソッドを使って、Parametersを IEnumerable
変換し、クエリ演算子が利用できるようにします。そして、Select(p => p.Value)で、
パラメータのシーケンスを取り出し、ToArray()で配列にします。

最後に

で、クエリを発行し、結果を戻しています。

このSelectWithUpdlockメソッドですが、すべてのクエリ式で試したわけではない
ですが、それなりに動いているみたいです。
かなり、強引な方法ですが、これを応用すれば、LINQ to SQLが対応していないSQL文の実行も、
わざわざSQL文を書かなくても、LINQ to SQL上で実行することが可能になる?かもしれません。



 

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

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