「Dapper」を編集中

ナビゲーションに移動 検索に移動

警告: ログインしていません。編集を行うと、あなたの IP アドレスが公開されます。ログインまたはアカウントを作成すれば、あなたの編集はその利用者名とともに表示されるほか、その他の利点もあります。

この編集を取り消せます。 下記の差分を確認して、本当に取り消していいか検証してください。よろしければ変更を保存して取り消しを完了してください。

最新版 編集中の文章
1行目: 1行目:
'''Dapper'''(読み:だっぱー)とは、[[.NET Framework]]向けの[[マイクロORM]]である。
+
'''Dapper'''とは、俗にいうMicro ORM。
 
 
== 概要 ==
 
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">
 
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
 
</source>
 
 
 
クエリの際に型を指定しないと結果が[[匿名型]]で自動生成されます。
 
まるで[[PHP]]のように扱いたいひと向け。
 
 
 
[[インテリセンス]]が効かない、参照先・参照元の一覧出力ができないなどの副作用を伴うので乱用はやめた方がいいけど、手軽すぎてやめられない。
 
前述の理由で[[クラス]]と[[テーブル]]が1対1で問題ない場合は使うべきではないですが、joinした結果を受け取りたい場合などにそのためだけに専用のマッピングクラスを作るのは面倒なのでこれを使うと手軽。
 
 
 
クエリー
 
<source lang="mysql">
 
select 1 A, 2 B union all select 3, 4;
 
</source>
 
結果
 
<pre>
 
+---+---+
 
| A | B |
 
+---+---+
 
| 1 | 2 |
 
| 3 | 4 |
 
+---+---+
 
</pre>
 
 
 
これを取得するコード。
 
<source lang="csharp">
 
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);
 
</source>
 
 
 
=== INSERT ===
 
パラメータを配列にすると複数行をinsertできます。
 
<source lang="csharp">
 
// {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 }
 
    }
 
);
 
</source>
 
  
 
== 関連項目 ==
 
== 関連項目 ==
 
* [[System.Transactions.TransactionScope]]
 
* [[System.Transactions.TransactionScope]]
* [[MySQL Connector/NET]]
 
  
 
== 外部リンク ==
 
== 外部リンク ==
 
* 公式サイト - http://code.google.com/p/dapper-dot-net/
 
* 公式サイト - http://code.google.com/p/dapper-dot-net/
 
* ソースコード - https://github.com/SamSaffron/dapper-dot-net
 
* ソースコード - https://github.com/SamSaffron/dapper-dot-net
 
 
{{stub}}
 
{{stub}}

MonoBookへの投稿はすべて、他の投稿者によって編集、変更、除去される場合があります。 自分が書いたものが他の人に容赦なく編集されるのを望まない場合は、ここに投稿しないでください。
また、投稿するのは、自分で書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください(詳細はMonoBook:著作権を参照)。 著作権保護されている作品は、許諾なしに投稿しないでください!

このページを編集するには、下記の確認用の質問に回答してください (詳細):

取り消し 編集の仕方 (新しいウィンドウで開きます)

このページで使用されているテンプレート:

このページは 1 個の隠しカテゴリに属しています: