Dapper.Netで1対多のマッピングをしてみよう。

タイトルの件、
ブログを書こうかな。と思い立ってググってみたら、

Dapper.Netで1対多のマッピングができるのか - けさらんぱさらん

既にトライしている方がいらっしゃいました。


既に公開されている情報ではありますが、
僕なりのやり方を書いておきます。


例えば、下のような2つのテーブルがあると仮定します。

親テーブル:MainData

CREATE TABLE [dbo].[MainData](
	[ID] [int] IDENTITY(1,1) NOT NULL,
	[Title] [nchar](100) NULL,
 CONSTRAINT [PK_MainData] PRIMARY KEY CLUSTERED 
(
	[ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]


子テーブル:SubData

CREATE TABLE [dbo].[SubData](
	[ID] [int] IDENTITY(1,1) NOT NULL,
	[MainDataID] [int] NULL,
	[Title] [nvarchar](100) NULL,
 CONSTRAINT [PK_SubData] PRIMARY KEY CLUSTERED 
(
	[ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]


そして、MainDataクラスのプロパティとして、
SubDataをコレクションとして保持したい場合、

public class MainData
{
        /// <summary>
        /// SubDataのコレクションです
        /// </summary>
        public List<SubData> SubData { get; set; }

        /// <summary>
        /// Selectを実行します。
        /// </summary>
        /// <returns></returns>
        public IEnumerable<MainData> Select()
        {
            var mains = new List<MainData>();
            MainData current = null;

            StringBuilder query = new StringBuilder();
            query.AppendLine("SELECT * FROM MainData");
            query.AppendLine("LEFT JOIN SubData ON MainData.ID = SubData.MainDataID");

            SqlConnection con = new SqlConnection("接続文字列");

            con.Query<MainData, SubData, MainData>(
                        query.ToString(),
                        (main, sData) =>
                        {
                            // オブジェクトにマッピング
                            if (current == null || current.ID != main.ID)
                            {
                                mains.Add(main);
                                current = main;
                                current.SubData = new List<SubData>();
                            }
                            current.SubData.Add(sData);
                            return current;
                        },
                        this, splitOn: "ID");

            return mains;
        }
}

これで、使用側は

var m = new MainData();
var s = m.SubData;

って感じで参照できます。


ところで、
Visual Studio 2012 Expressがすごく便利だけど、
起動がアホみたいに遅い・・・。
2003の頃に戻ったみたいだ。。。