前回は Dapper を使ってひとつのテーブルからデータを取得したが、今回は JOIN した場合をやってみる。

準備として、SubCategory テーブルを追加する。前回作った Product テーブルと SubCategoryId で JOIN する。したがって前回作ったデータに対応する SubCategoryId のデータを作っておく。
CREATE TABLE [dbo].[SubCategory](
	[SubCategoryId] [int] NOT NULL,
	[Name] [nvarchar](50) NULL,
	[CategoryId] [int] NULL,
 CONSTRAINT [PK_SubCategory] PRIMARY KEY CLUSTERED 
(
	[SubCategoryId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

JOIN した場合のコードは以下のようになる。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Dapper;
 
namespace DapperTest1
{
    public partial class Form1 : Form
    {
        private string connectionString = "Data Source=(local);Database=ORMTest;User ID=ORMTest_user;Password=ORMTest_password";
 
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            IEnumerable<Product> resultList = null;
 
            using (var conn = new SqlConnection(connectionString))
            {
                conn.Open();
                resultList = conn.Query<Product, SubCategory, Product>(
                    @"SELECT p.*, s.* FROM Product p 
                    INNER JOIN SubCategory s ON s.SubCategoryId = p.SubCategoryId",
                    (p, s) => { p.SubCategory = s; return p; },
                    splitOn: "SubCategoryId"
                ).ToList();
                conn.Close();
            }
 
            dataGridView1.AutoGenerateColumns = false;
            dataGridView1.Columns.AddRange(
                new DataGridViewTextBoxColumn()
                {
                    DataPropertyName = "ProductId",
                    Name = "ProductId",
                },
                new DataGridViewTextBoxColumn()
                {
                    DataPropertyName = "Name",
                    Name = "Name",
                },
                new DataGridViewTextBoxColumn()
                {
                    DataPropertyName = "Price",
                    Name = "Price",
                },
                new DataGridViewTextBoxColumn()
                {
                    DataPropertyName = "SubCategoryId",
                    Name = "SubCategoryId",
                },
                new DataGridViewTextBoxColumn()
                {
                    DataPropertyName = "SubCategoryName",
                    Name = "SubCategoryName",
                }
            );
 
            dataGridView1.DataSource = resultList;
        }
    }
 
    public class Product
    {
        public int ProductId { get; set; }
        public string Name { get; set; }
        public int Price { get; set; }
        public int SubCategoryId { get; set; }
 
        public SubCategory SubCategory { get; set; }
        public string SubCategoryName { get { return SubCategory.Name; } }
    }
 
    public class SubCategory
    {
        public int SubCategoryId { get; set; }
        public string Name { get; set; }
        public int CategoryId { get; set; }
    }
}

Product クラスに SubCategory クラスへの参照が追加されており、conn.Query のパラメータとして結合情報を渡している。

また、SubCategoryName プロパティも追加したが、これは DataGridView に表示するためのもので、 必ずしも必要ではない。

実行結果は以下のようになる。
dapper-2

以上。