Morning Girl

Web API, Windows, C#, .NET, Dynamics 365/CRM etc..

ADO.NET ORM の Dapper で CData ADO.NET Provider の使い方

最近 Sansan の中の人のBlogで「今までEntityFrameworksとDapperを使っていたけれど、軽量なDapperを全面的に採用しました」というのを見かけました。

buildersbox.corp-sansan.com

私自身が今まで Dapper を使ったことが無かったので、どんな感じなのかな? という点と、ADO.NET ベースなら、CData ADO.NET Providerも動くでしょ! と思ったので、検証してみた結果をまとめてみたいと思います。

Dapper とは?

f:id:sugimomoto:20191120135238p:plain

dapper-tutorial.net

C#用の軽量なORMです。C# のORMといえば、EntityFrameworkが有名かつMicrosoftが提供していることもあるのでスタンダードな印象ですが、

EntityFrameworkはSQLクエリのレイヤーをあまり意識せず(あまりね)、扱うことができるのが特徴だと思いますが、DapperではSQL自体は自身で記述して、そこから取得したデータをオブジェクトにマッピングしてくれるのが特徴です。

シンプルなDapperの使い方

一番シンプルなSELECTクエリで試してみたいと思います。チュートリアルこちらを参照。

なお、今回は.NET Core 3.0・Visual Studio 2019で試しています。

とりあえず、nuget で Dapperを入手しましょう。

PM> Install-Package Dapper

対象となるデータベースおよびテーブルはお馴染みAdventureWorksのProductsテーブルです。

f:id:sugimomoto:20191120135040p:plain

使い方は、一度でもDataAdapter を使ってSQL Serverにアクセスしたことがある人であれば、難しくないと思います。

SqlConectionを生成し、QueryメソッドでSQLを渡すだけです。その際に格納したいClassを指定すれば、そのまま項目がClassのプロパティにマッピングされていきます。手軽で素晴らしい。

gist.github.com

こんな感じで取得できました。

f:id:sugimomoto:20191120135054p:plain

CData ADO.NET で Dapperを使う方法

次に CData ADO.NET を経由してDapperを利用してみたいと思います。

CData ADO.NET Providerは各種クラウドサービスWeb API(kintoneやSalesforceやDynamics 365等)やNoSQL(MongoDBやRedis等)にADO.NETベースでのアクセスを可能にするDriverライブラリ製品です。

通常であれば、HTTP Requestでデータを取得したり、更新したりするWeb APISQLでアクセスできるようにするのが特徴です。

今回は最近リリースされたばかりの名刺管理サービス Sansan の ADO.NET Providerを使ってみたいと思います。

f:id:sugimomoto:20191120135103p:plain

以下のURLからトライアルがダウンロードできるので取得し、インストールしておきます。

https://www.cdata.com/jp/drivers/sansan/ado/

インストール後、コンソールアプリケーションのプロジェクトを作成したら、以下のフォルダから .net standard 版のSansan ADO.NET Provider DLLを参照します。

C:\Program Files\CData\CData ADO.NET Provider for Sansan 2019J\lib\netstandard2.0

f:id:sugimomoto:20191120135110p:plain

Sansan ADO.NETはその名の通り、DataReaderやDataAdapter、EntityFrameworkなどのADO.NET フレームワークでアクセスできます。

ADO.NETベースで構成された専用のConnectionクラス(SansanConnection)が提供されているので、それを介してDapperを利用します。

cdn.cdata.com

ほぼ、先程のコードと変わらないですね。SqlConnectionをSansanConnectionに切り替えて、専用の接続文字列を指定するだけです。(Sansan API Keyの取得方法はこちらを参照してください。)

gist.github.com

なお、テーブルの定義は以下のリファレンスから参照できます。

cdn.cdata.com

これでデバッグをしてみると、Sansan Web API経由で取得したデータがDapperを通り、BizCardクラスに格納され、参照することができます。

f:id:sugimomoto:20191120135150p:plain

ADO.NETSQLを介して、APIアクセスというと不思議な感じがするかもですが、かなり手軽にWeb APIを扱うことができ、またDapperを使うことでオブジェクトマッピングが手軽になるので、ビジネスロジックに集中できる感じで良いです。