けさらんぱさらん

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

Dapper.Netの続き

http://d.hatena.ne.jp/cer1974/20120205/1328450442:Title=前回のDapperの続き

今日は、Joinして2つのオブジェクトにマップしてみます。
前回のMemberとJoinするOrderというクラスを作成します。

public class Order
{
  public long OrderID { get; set; }
  public DateTime OrderDate { get; set; }
  public long MemberID { get; set; }
  public Member Member { get; set; }
}

プロパティとしてMemberオブジェクトを持ちます。
Orderから見たMemberの多重度は1としてます。

さてこれをDapperでクエリを投げてマップしてもらいましょう

IDbConnection db = new OracleConnection("User Id=test;Password=pass;Data Source=xe;");

db.Open();

var order = db.Query<Order, Member, Order>(
  "select \"order\".ORDER_ID OrderID, \"order\".ORDER_DATE OrderDate," +
  "\"order\".MEMBER_ID MemberID, member.MEMBER_ID MemberID, member.MEMBER_NAME MemberName" +
  " from ORDERS \"order\" inner join MEMBER member on \"order\".MEMBER_ID = member.MEMBER_ID" +
  " where \"order\".ORDER_ID = :id",
  ( o, m ) => { o.Member = m; return o; },
  new { id = 61 }, splitOn : "MemberID" ).SingleOrDefault();

Console.WriteLine( order.OrderID + "|" + order.OrderDate + "|" + order.Member.MemberName );

非常に見づらくて申し訳ない・・・
JoinするSQLは普通に作って良いのですが、前回も書いたようにOracleさんの命名が大文字なので
別名を付けています。
加えて別名として使うクラス名Orderが予約語なのでダブルクォーテーションで囲っています。
ということで見づらい・・・
第2引数でOrderのプロパティMemberにMemberのインスタンスを代入します。
第4引数でsplitOnという引数にJoinするキーを指定してます。
これは、DBの方のキー名では無くてクラスの方のキー名になるようです。

間違えました。たぶん名前からしてマッピングするオブジェクトの区切りだと思います。
まだソースがちゃんと読み切れてないのでたぶんなんですけど


一応、これで結合できました。
でもこれは1対1のJoinとなるので1対多の場合はどうするのでしょう?
今日は眠いのでここまで