dapper dot netで1レコードを複数のオブジェクトにマッピングする

dapper dot netを使って、2つのテーブルをjoinして取得した1レコードを2つのオブジェクトにマッピングしてみます。

まずはこんなモデルを用意します。

class Category {
    public int Id { get; set; }
    public string Name { get; set; }
}
class Book {
    public int Id { get; set; }
    public string Title { get; set; }
    public Category Category { get; set; }
}

データも準備して、問い合わせをしてみましょう。 Queryメソッドの第2引数にマッピング用のデリゲートを渡します。

// データ準備
connection.Execute(@"
create table #Category(Id int, Name nvarchar(50));
create table #Book(Id int, Title nvarchar(50), CategoryId int);

insert into #Category(Id, Name)
values(1, 'プログラミング'), (2, 'データベース');
insert into #Book(Id, Title, CategoryId)
values(1, 'C#の本', 1), (2, 'JavaScriptの本', 1), (3, 'SQLの本', 2);");

// クエリ実行とマッピング
var books = connection.Query<Book, Category, Book>(@"
select *
from #Book
  inner join #Category
      on #Book.CategoryId = #Category.Id;",
    // マッピング用デリゲート
    (book, category) => {
        book.Category = category;
        return book;
    });
foreach(var book in books) {
    Console.WriteLine("{0} {1} {2}", book.Id, book.Title, book.Category.Name);
}

実行結果はこうなります。

1 C#の本 プログラミング
2 JavaScriptの本 プログラミング
3 SQLの本 データベース