本文へスキップ
BecomeCoder

C#実践コース · 第6章 代表的なNuGetパッケージとその使い方 · レッスン31

Dapper ― 軽量ORMで速くSQLを扱う(ローカル実施)

ローカル実施

導入

代表的なSDKの回で、生のADO.NET(冗長)とフル機能のEF Core(多機能)を学びました。その中間がDapperです。SQLは自分で書きますが、結果をC#オブジェクトへ自動マッピングしてくれます。薄くて速いため、性能が要る場面で根強い人気があります。

図解

flowchart LR
    SQL["あなたが書くSQL<br/>SELECT ... WHERE Price >= @min"] --> DAP["Dapper<br/>Query&lt;T&gt; / Execute"]
    DAP -->|1行=1オブジェクトに変換| OBJ["List&lt;Book&gt;"]
    DAP --> DB[("データベース")]

進め方

  1. スターター115-dapper/starter.zipを展開し、DapperLesson.slnを開く(Dapper + Microsoft.Data.Sqlite導入済み)
  2. Program.csのTODOを埋める
  3. 期待される出力と照合する
Visual StudioでDapperのQueryを実行し、価格2000円以上の書籍がオブジェクトとして取得されコンソールに表示された様子
自分で書いたSQLの結果が、そのままBookオブジェクトの一覧になる

学ぶこと

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.NETReaderループを書かずに済み、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