メインメニューを開く

差分

Dapper

2,636 バイト追加, 2016年2月24日 (水) 02:18
'''Dapper'''とは、(読み:だっぱー)とは、[[.NET Framework]]向けの俗にいうMicro ORM。向けの[[Entity Framework]]や[[Active RecordマイクロORM]]のような重量級ORMとは違い、SQL周りのソースコードをまるでPHPなどのLL言語を使っているかのようにサラサラと書けるという代物。である。
公式サイトではSQL ServerとSQL Liteで動作確認をしているとのことだが、MySQL(== 概要 ==Dapperは[[Entity Framework]]や[[Active Record]]のような重量級ORMとは違い、[[SQL]]周りの[[ソースコード]]をまるで[[PHP]]などの[[LL言語]]を使っているかのようにサラサラと書けるという代物である。 Dapperはほぼ生の[[SQL]]文を投げると、その結果を[[C Sharp|C#]]の[[クラス]]に自動的に格納(マッピング)してくれる。[[.NET]]標準の[[ADO.NET]]だとクエリ結果は1カラム毎にGetValueメソッドを呼びだして値を取得し、さらに値の型は自前で明示的にキャストして解決するというキチガイ級に面倒でバグの原因になりやすい部分をDapperを使うことでほぼ全自動にできる。 なお、Dapperは上記のような単純な結果のマッピングだけを行うものであり、[[LINQ]]を[[SQL]]に変換されたり、[[外部キー]]を頼りに[[リレーション]]を自動解決してくれるなどという重量級[[ORM]]の主要機能といわれるものは一切搭載していない。 公式サイトでは[[SQL Server]]と[[SQL Lite]]で動作確認をしているとのことだが、[[MySQL]]([[MySQL Connector/NET]])でもちょろっと使ってみた限りでは特に問題はない模様。)や[[PostgreSQL]]([[Npgsql]])でも特に問題はないようである。ADO.NETのドライバがある[[データベース]]はほぼ動くと思われる。
== 使い方 ==
=== 接続 ===
0、[[NuGet]]からNpgsqlとDapperを入れる。
 
1、Web.configにConnectionStringを設定する。ConnectionStringは[[ソースコード]]に埋め込んでもいいが後から変更が大変なのでWeb.configやApp.configを利用するのが望ましい。Npgsqlを使用しているが他も似たようなもん。
<source lang="xml">
<?xml version="1.0"?>
<configuration>
<!-- 省略 -->
 
<system.data>
<DbProviderFactories>
<add name="Npgsql Data Provider" invariant="Npgsql" support="FF" description=".Net Framework Data Provider for Postgresql" type="Npgsql.NpgsqlFactory, Npgsql" />
</DbProviderFactories>
</system.data>
 
<connectionStrings>
<add name="default" providerName="Npgsql" connectionString="Server=localhost; Port=5432; User Id=monobook; Password=; Database=monobook" />
</connectionStrings>
 
<!-- 省略 -->
</source>
 
2、「参照」に「System.Configuration」を追加する。
 
3、使ってみる。
[[PGroonga]]を入れた状態で[[全文検索]]を行っても問題ない。
<source lang="csharp">
var cs = ConfigurationManager.ConnectionStrings["default"].ConnectionString;
using (var con = new NpgsqlConnection(cs))
{
con.Open();
var memos = con.Query<Memos>(@"select * from memos where content %% '全文検索'");
foreach (var memo in memos)
{
Console.WriteLine(memo);
}
}
</source>
 
=== SELECT ===
<source lang="csharp">
</source>
=== SELECT ===クエリの際に型を指定しないと結果が[[匿名型]]で自動生成されます。結果が匿名型で自動生成されます。まるでPHPのように扱いたいひと向け。まるで[[PHP]]のように扱いたいひと向け。
インテリセンスが効かない、参照先・参照元の一覧出力ができないなどの副作用を伴うので乱用はやめた方がいいけど、手軽すぎてやめられない。[[インテリセンス]]が効かない、参照先・参照元の一覧出力ができないなどの副作用を伴うので乱用はやめた方がいいけど、手軽すぎてやめられない。前述の理由でクラスとテーブルが1対1で問題ない場合は使うべきではないですが、joinした結果を受け取りたい場合などにそのためだけに専用のマッピングクラスを作るのは面倒なのでこれを使うと手軽。前述の理由で[[クラス]]と[[テーブル]]が1対1で問題ない場合は使うべきではないですが、joinした結果を受け取りたい場合などにそのためだけに専用のマッピングクラスを作るのは面倒なのでこれを使うと手軽。
クエリー
=== INSERT ===
パラメータを配列にすると複数行をinsertできます。
<source lang="csharp">
// {1,1},{2,2},{3,3}という3行がinsertされる
匿名利用者