きよくらの備忘録

「三日坊主と呼ばせない!日記」改め。主にソフトウェア開発関連の話題。

DapperはIN句も自動でマップしてくれるのが便利

本エントリはC# Advent Calendar 2013 3日目のエントリです。

Dapperいいよ、Dapper

最近は完全にDapper派(?)になっています。 ということで、今日はタイトルの通りDapperのIN句へのマップ機能を紹介したいと思います。

 

IN句に配列やリストを自動でマップする

通常、SQLの標準のプロバイダで利用できるプリペアード・ステートメントでもIN句についてはあまり文化的な対応ができないんじゃないかと思います。IN句に含めるリストに値をバインドしないといけない場合、どうしても動的にSQLを組む必要に駆られがちです。リストの要素の数だけバインド変数を作るってそれぞれにバインドする……のが良いのでしょうが、ついつい値込で直接SQL組をんじゃったり……*1

 

ですがこれ、Dapperを使うと簡単に解決できます。Dapperを使うと、こんな風に書けるんです。

便利ですよね?

 

どうSQLが組まれてどうバインドされているのか

便利なのはいいのですが、どのようにSQLが組まれ、実行されているのでしょうか。気になりますよね。

 

GlimpseとアドオンのGlimpse.Adoを使うと、実行したSQLを簡単に確認することができます。ということで、ASP.NETのアプリケーションとして上記のSQLを実行してみました。

 

f:id:kiyokura:20131201204507p:plain

なるほど、リテラルとして文字列でSQLを組み立てるのではなく、リスト要素の数だけ連番でパラメータを作成してバインドしているようです。これなら文字列のリストを渡す場合でも、安全性そうですね。

また上記の例だとジェネリックリストを渡していますが、単純な配列でも問題ないようです。

 

まとめ

いかがだったでしょうか。

実はこれ、偉そうに紹介するようなことではなく、Dapperのサイトでも紹介されている代表的な機能の一つです(Dapper - a simple object mapper for .Net#List Support)。

この他、Dapperにはドキュメンドが少ないこともあり、テストコードを眺めたりしてると新しい発見があるかもしれません。まだ見たことがない方は、ぜひ一度見てみること面白いかと思います。

ということで、ちょっと軽めの内容でしたが、これにて本日のエントリを終わりたいと思います。 次は…週末にOne ASP.NET Advent Calendarでお会いしましょう!

*1:良い子は真似してはいけません