「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。 -[[戻る>データアクセスのいろいろ]] * 目次 [#xc0629db] #contents *概要 [#n112bc5b] [[ココ>https://github.com/OpenTouryoProject/MultiPurposeAuthSite/blob/develop/root/programs/MultiPurposeAuthSite/MultiPurposeAuthSite/Models/ASPNETIdentity/Entity/UserStore.cs]]で使用したので調査した情報などを纏めました。 Dapperは、Micro-ORMである。 -Micro-ORMは、RDBとはマッピングしないので、ORMではない。 -言うなれば、DataMapperとかTableMapperと言った機能。 -実際、Dapperは、 --純粋な実行とBean(POCO)とのマッピングのみ提供する。 --パフォーマンスと使いやすさを念頭に置いて開発されている。 *機能 [#x4d90167] 以下の機能を持つ。 **クエリビルダ [#ifc13812] -基本的には無い。 -生SQLを実行する機能のみ提供される。 -[[以下の拡張ライブラリ>#x97c4fa1]]が該当機能を提供している。 **SQL実行 [#ae021507] ***パラメタライズド・クエリ [#z0411107] パラメタライズド・クエリ機能はアリ。 -ADO.NETよりパラメタライズド処理が書き易い。 -IN句に含めるリストに値をバインドする機能などもある。 ***トランザクション [#v70097e2] トランザクション処理に対応する。 以下のように処理すると良い。 -RazorでのDapperサンプル(トランザクション使ってUpdate)~ https://gist.github.com/kiyokura/7185408 -usingステートメントを使えば~ SqlTransactionの明示的なRollbackは不要 - プログラマーな日々~ http://blog.jhashimoto.net/entry/20111008/1318231481 未コミットのものはロールバックになるので、try-catchは不要。 using(var tr = cn.BeginTransaction()) { cn.Execute("・・・・", ・・・, tr); tr.Commit(); } ***その他 [#od2ce0fa] -ストアドプロシジャを実行可能。 **マッピング [#gb94a6a8] 結果セットとBean(POCO)をマッピングする機能。 -Queryメソッドでは、IEnumrable<Dynamic>型に格納される。 -Query<T>メソッドでは、T型のBean(POCO)にマッピングして、格納される。 -列名に別名を付与する場合は、AS句を使用すれば良い。 -大文字・小文字は関係なくマッピングする。 -別途マッピングルールを型毎に設定することが可能。 -ADO.NET 型付DataSet の場合よりマッピング処理が書き易い。 **実装 [#q3dc7250] 主に、ADO.NET の IDBConnection に拡張メソッドを追加している。 *拡張 [#x97c4fa1] 以下の様なCRUDヘルパーがある。 **更新用の拡張ライブラリ [#i2b00ee4] ***DapperExtensions [#g2da64d7] -SQLを書かずして更新処理を実装する。 -テーブルに対応したBean(POCO)が必要になる。 -デフォルトでは以下の条件に合致している必要がある。 --テーブルの主キーが1つ --Idや****Idといった名称 -参考 --hollycot: DapperExtensionsを使ってみる~ http://hollycot.blogspot.jp/2015/05/dapperextensions.html --hollycot: DapperExtensionsを使ってみる2~ http://hollycot.blogspot.jp/2015/09/dapperextensions.html **クエリビルダ [#ye7bc04a] ***Dapper.Rainbow [#hab4a1bf] 詳細不明 ***Dapper.Contrib [#mc6cf830] 詳細不明 ***自作の例 [#qac59d34] 以下を参考にすると、上記は微妙らしい。 -neue cc - Micro-ORMとC#(とDapperカスタマイズ)~ http://neue.cc/2012/12/11_390.html ココの処理の内容を見ると、 -ExpressionHelperを引数に取る拡張メソッド~ ≒ LINQを処理可能な拡張メソッド でSQLを生成している。 余談: >と言うことで、パラメタセットによって、SQL定義を動的に編集する方法ではなさそう。~ Dapperは、パラメタセットはBean(POCO)のプロパティ ≒ 固定なので、~ 別の方法でSQL編集するしか無く、ParameterによってSQL定義を編集する、~ 動的パラメタライズド・クエリに組み込むことが不可能だった。 **ログ出力 [#we3de767] MiniProfilerを使用してログ出力処理を実装できる。 -Output the tracelog using Dapper. · Issue #45 · OpenTouryoProject/MultiPurposeAuthSite~ https://github.com/OpenTouryoProject/MultiPurposeAuthSite/issues/45 *クラスの階層構造 [#r2fede70] 以下のようにORMできるが、 -dapper dot net - 1対多のテーブルをコレクションプロパティにマッピングする - いちろぐ~ http://ichiroku11.hatenablog.jp/entry/2015/04/13/234109 -Code, code and more code.: Exploring Tuples as a Library Author~ http://blog.marcgravell.com/2017/04/exploring-tuples-as-library-author.html BA(ビジネス・アプリケーション)ではほぼ、採用しない方式。 -スキーマ構造に合わせたデータ保持をしない。 --論理データ独立性が重要。 --また、コードが複雑化する。 -プログラム側でのOrderByで性能が劣化する。 *JSONへの変換 [#x6685da9] DapperのQuery<dynamic>()の戻り値をJSONへ変換して、~ サーバーをJSON吐く土管にする場合、以下のようにできる。 -DapperのQuery<dynamic>()の戻りをASP.NET MVCのJsonResultでいい感じで返す - きよくらの備忘録~ http://kiyokura.hateblo.jp/entry/2014/12/04/000818 -DapperのQuery<dynamic>()の結果セットのフィールド名を取得する - きよくらの備忘録~ http://kiyokura.hateblo.jp/entry/2016/12/09/131602 *Oracleでの利用 [#u255c115] -Dapper.Netを使ってみる - けさらんぱさらん~ http://d.hatena.ne.jp/cer1974/20120205/1328450442 -DapperでOracleのNUMBERと.NETのBooleanをマッピングする - きよくらの備忘録~ http://kiyokura.hateblo.jp/entry/2013/11/08/015826 -Getting started with Dapper – logically illogical~ https://takaloy.wordpress.com/2015/05/10/getting-started-with-dapper/ -Dapper – Micro ORM for Oracle and Microsoft .NET~ https://blog.vijay.name/2012/07/dapper-micro-orm-for-oracle-and-microsoft-net/ *参考 [#c5ba050d] -ORMとかdapper dot netについてお話させていただきました - きよくらの備忘録~ http://kiyokura.hateblo.jp/entry/20131014/p1 -Dapperの簡単な使い方メモ (Dapper .NET, Micro ORM, 速い) - いろいろ備忘録日記~ http://devlights.hatenablog.com/entry/2014/02/02/000000 --Dapper .NETのサンプル~ https://gist.github.com/devlights/8779382 -C# + MySQL + Dapper で軽量 O/R Mapper | Aiming 開発者ブログ~ https://developer.aiming-inc.com/programming/csharp-mysql-dapper/ -How to work with Dapper in C# | InfoWorld~ http://www.infoworld.com/article/3025784/application-development/how-to-work-with-dapper-in-c.html -データ ポイント - Dapper、Entity Framework、およびハイブリッド アプリ~ https://msdn.microsoft.com/ja-jp/magazine/mt703432.aspx **使用例 [#gda6d541] -[[MultiPurposeAuthSiteのUserStoreクラスでDapperを使用しました。>https://github.com/OpenTouryoProject/MultiPurposeAuthSite/blob/develop/root/programs/MultiPurposeAuthSite/MultiPurposeAuthSite/Models/ASPNETIdentity/Entity/UserStore.cs]] **[[ADO.NET vs ORM (Entity Framework, Dapper)]] [#n76b8155] ---- Tags: [[:データアクセス]], [[:.NET開発]], [[:ADO.NET]]