Dapper
Dapper(読み:だっぱー)とは、.NET Framework向けのマイクロORMである。
概要
DapperはEntity FrameworkやActive Recordのような重量級ORMとは違い、SQL周りのソースコードをまるでPHPなどのLL言語を使っているかのようにサラサラと書けるという代物である。
Dapperはほぼ生のSQL文を投げると、その結果をC#のクラスに自動的に格納(マッピング)してくれる。.NET標準のADO.NETだとクエリ結果は1カラム毎にGetValueメソッドを呼びだして値を取得し、さらに値の型は自前で明示的にキャストして解決するというキチガイ級に面倒でバグの原因になりやすい部分をDapperを使うことでほぼ全自動にできる。
なお、Dapperは上記のような単純な結果のマッピングだけを行うものであり、LINQをSQLに変換されたり、外部キーを頼りにリレーションを自動解決してくれるなどという重量級ORMの主要機能といわれるものは一切搭載していない。
公式サイトではSQL ServerとSQL Liteで動作確認をしているとのことだが、MySQL(MySQL Connector/NET)やPostgreSQL(Npgsql)でも特に問題はないようである。ADO.NETのドライバがあるデータベースはほぼ動くと思われる。
使い方
SELECT
public class UserRawModel
{
public string user_id { get; set; }
public string user_name { get; set; }
// nullable
public int? user_age { get; set; }
}
var guid = Guid.NewGuid();
var user = connection.Query<UserRawModel>(
@"select user_age = @user_age, user_id = @user_id"
, new { user_age = (int?)null, user_id = guid });
Console.WriteLine(dog.Count()); // 1
Console.WriteLine(dog.First().user_age); // null
Console.WriteLine(dog.First().user_id); // guid
結果が匿名型で自動生成されます。 まるでPHPのように扱いたいひと向け。
インテリセンスが効かない、参照先・参照元の一覧出力ができないなどの副作用を伴うので乱用はやめた方がいいけど、手軽すぎてやめられない。 前述の理由でクラスとテーブルが1対1で問題ない場合は使うべきではないですが、joinした結果を受け取りたい場合などにそのためだけに専用のマッピングクラスを作るのは面倒なのでこれを使うと手軽。
クエリー
select 1 A, 2 B union all select 3, 4;
結果
+---+---+ | A | B | +---+---+ | 1 | 2 | | 3 | 4 | +---+---+
これを取得するコード。
var rows = connection.Query("select 1 A, 2 B union all select 3, 4")
.ToList(); // 配列(リスト)に変換
Console.WriteLine(rows[0].A);
Console.WriteLine(rows[0].B);
Console.WriteLine(rows[1].A);
Console.WriteLine(rows[1].B);
INSERT
パラメータを配列にすると複数行をinsertできます。
// {1,1},{2,2},{3,3}という3行がinsertされる
// 戻り値は変更された行数
var affected_rows = connection.Execute(
@"insert MyTable(colA, colB) values (@a, @b)",
new[] { // パラメータを配列にすると複数行をinsertできます。
new { a=1, b=1 },
new { a=2, b=2 },
new { a=3, b=3 }
}
);