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の頃に戻ったみたいだ。。。