dapper dot netで1レコードを"Id"列以外で分割してマッピングする(splitOnパラメータ)

前回dapper dot netを使って1レコードを複数オブジェクトにマッピングしてみました。

dapperはIDカラム名が"Id"と仮定して1レコードを複数のオブジェクトにマッピングしているようです。("Id"列をキーに分割してると言った方が分かりやすいかも。)

important note Dapper assumes your Id columns are named "Id" or "id", if your primary key is different or you would like to split the wide row at point other than "Id", use the optional 'splitOn' parameter.

主キーのカラム名が"Id"以外の場合は、splitOnパラメータを使ってねってことなので試してみます。引用元はこちら

まずはモデル。

class Book {
    public string Isbn { get; set; }
    public string Title { get; set; }
}

class Order {
    public int Id { get; set; }
    public DateTime Date { get; set; }
    public Book Book { get; set; }
}

クエリを実行してマッピングしましょう。

var orders = connection.Query<Order, Book, Order>(@"
select
  1 as Id,
  '2013/02/16' as Date,
  '0001234567890' as Isbn,
  'すごい本' as Title;",
    (order, book) => {
        order.Book = book;
        return order;
    },
    // "Isbn"以降をBookにマッピング
 splitOn: "Isbn");
foreach(var order in orders) {
    Console.WriteLine("{0} {1:d} {2} {3}",
        order.Id, order.Date, order.Book.Isbn, order.Book.Title);
}

ちゃんとマッピングできてますね。

1 2013/02/16 0001234567890 すごい本

ソース全体はこちらにあります。

(そういえば正式にはDapper?Dapper.NET?なんですかね。)