けさらんぱさらん

方向性は定めず、ただ思いつくままに

Dapper.Netを使ってみる

自分は.NETのORMは、EntityFrameworkかS2Cao.Netを使っていたのですが
もうちょっと小軽く使えるものはないかと探していまして
Dapperを少し使ってみたので備忘的に残します。


Dapperは、C#(.Net)で使えるマイクロORMってやつです。
マイクロなだけにシンプルで使いやすいってのが特徴なんですかね?
まあそんなに迷わずに使えてます。


Dapperは、IDbConnectionの拡張メソッドとして機能を提供しています。
まずは、データ取得してみます。

IDbConnection db = new OracleConnection("User Id=test;Password=pass;Data Source=xe;");
db.Open();
var member = db.Query( "select MEMBER_ID, MEMBER_NAME, GROUP_ID from MEMBER where MEMBER_ID = :memid",
  new { memid = 1 } ).ToList();
member.ForEach( m => Console.WriteLine( m.MEMBER_NAME ) );


ちなみにDBは、会社で使用することが多いという理由でOracleDBです。
まず普通にConnectionをNewしてからOpenしてます。
んでConnectionクラスのQueryメソッドでクエリを発行します。
後はIEnumrableで返ってくるので煮るなり焼くなりw
この場合は、IEnumrableの中にはDynamic型で入ってます。


次にDynamicでなくちゃんと型指定で取得してみます。

public class Member
{
  public long? MemberID { get; set; }
  public string MemberName { get; set; }
  public long? GroupID { get; set; }
  public Group Group { get; set; }
}

まず入れ物作成

var member2 = db.Query<Member>( "select MEMBER_ID, MEMBER_NAME, GROUP_ID from MEMBER where MEMBER_ID = :memid",
  new { memid = 1 } ).ToList();

ジェネリックの方のメソッドを使用すれば型指定ができます。
でもこのままでは取得できません。
Oracleの場合、基本的にオブジェクト名が全て大文字となるので単語の区切りをアンダバーとしています。
クラスの方は普通に区切りに大文字、他は小文字としているのでマッピングできません。
属性でテーブル名やカラム名を指定できれば良いのですがそんな機能も無いようです。

var member2 = db.Query<Member>(
  "select MEMBER_ID as MemberID, MEMBER_NAME as MemberName, GROUP_ID as GroupID from MEMBER where MEMBER_ID = :memid",
  new { memid = 1 } ).ToList();

カラム名に別名つけてみました。
Yes!
取得できました。どうやら大文字小文字は関係なくマッピングしてくれるみたいですね。


とりあえず今日はここまで