導入
代表的なSDKの回で、生のADO.NET(冗長)とフル機能のEF Core(多機能)を学びました。その中間がDapperです。SQLは自分で書きますが、結果をC#オブジェクトへ自動マッピングしてくれます。薄くて速いため、性能が要る場面で根強い人気があります。
図解
flowchart LR
SQL["あなたが書くSQL<br/>SELECT ... WHERE Price >= @min"] --> DAP["Dapper<br/>Query<T> / Execute"]
DAP -->|1行=1オブジェクトに変換| OBJ["List<Book>"]
DAP --> DB[("データベース")]
進め方
- スターター
115-dapper/starter.zipを展開し、DapperLesson.slnを開く(Dapper+Microsoft.Data.Sqlite導入済み) Program.csのTODOを埋める- 期待される出力と照合する
学ぶこと
using Dapper;
using Microsoft.Data.Sqlite;
using var conn = new SqliteConnection("Data Source=shop.db");
// INSERT/UPDATE/DELETE は Execute。値は匿名オブジェクトでパラメータ化(SQLインジェクション対策)
conn.Execute("INSERT INTO Books (Title, Price) VALUES (@Title, @Price)",
new { Title = "C#入門", Price = 2400 });
// SELECT は Query<T>。列名とプロパティ名が一致すれば自動でマッピング
IEnumerable<Book> books =
conn.Query<Book>("SELECT Id, Title, Price FROM Books WHERE Price >= @min", new { min = 2000 });
foreach (var b in books) Console.WriteLine($"{b.Title}: {b.Price}円");
record Book(int Id, string Title, int Price);
Query<T>はSELECT結果をTの一覧へ、Executeは更新系SQLを実行する- パラメータは
new { min = 2000 }のように匿名オブジェクトで渡す(必ずパラメータ化) ADO.NETのReaderループを書かずに済み、EF Coreより薄く高速。SQLは自分で管理したい時に最適- 位置づけ:ADO.NET(手動)< Dapper(薄い) < EF Core(多機能)
期待される出力
C#入門: 2400円
実践DDD: 3800円
まとめ
- Dapperは
Query<T>/Executeで、SQLの結果をオブジェクトに自動マッピングする軽量ORM - パラメータは匿名オブジェクトで安全に渡す
- ADO.NETとEF Coreの中間。速度と制御を求める場面で選ばれる
次回: 実務の定番ログライブラリlog4netをNuGetの観点で位置づけます。
テンプレート構成(教材制作用メモ)
115-dapper/
├── starter.zip # Dapper + Microsoft.Data.Sqlite導入済み / 初期データ投入 / Program.cs(TODO入り)
└── solution/Program.cs