Dapper入門|C#の軽量ORMの使い方【SQLite・CRUD・SqlKata連携】

この記事のコードは .NET 10(C# 14)で動作を確認した内容です。パッケージのバージョンで書き方が変わることがあるので、詰まったときは各ライブラリの公式ドキュメントもあわせて確認してください。

C#でデータベースを触るとき、「Entity Framework は大げさすぎるけど、SqlDataReader で1行ずつ読むのは面倒」と感じたことはありませんか。その中間にちょうどいいのが Dapper です。書いたSQLの結果を、C#のクラスにサッと詰めてくれる軽量なライブラリです。

この記事では、Dapper とは何かから、SQLite を使ったCRUD(追加・取得・更新・削除)、そして SqlKata と組み合わせてSQLを安全に組み立てる方法までを、手を動かしながら見ていきます。

目次

Dapperとは(EF Coreとの違い)

Dapper は Stack Overflow のチームが作った マイクロORM です。ORM(オブジェクト関係マッピング)と名前は付きますが、やることは絞られています。

  • あなたが書いたSQLを実行し、結果をC#のオブジェクトに詰める。ここに特化している
  • 速い。生の ADO.NET に近い性能が出る
  • 変更追跡・マイグレーション・自動SQL生成といった重い機能は持たない

対する Entity Framework Core(EF Core)はフル装備のORMで、SQLを書かなくてもC#のコードからDB操作ができ、マイグレーションでテーブル定義も管理してくれます。ざっくり整理するとこうです。

  • Dapper:SQLは自分で書く。軽くて速い。SQLをコントロールしたい人向け
  • EF Core:SQLをほぼ書かない。多機能。生産性重視・スキーマ管理も任せたい人向け

どちらが正解ということはなく、用途で使い分けるのが実務では一般的です(この使い分けは記事末のガイドで詳しく整理します)。

書いたSQL実行DapperマッピングC#オブジェクト
図1:Dapperは「SQLの実行」と「結果 → オブジェクトの詰め込み」を担う

準備:プロジェクトとNuGetパッケージ

まずコンソールアプリを作り、Dapper と SQLite のパッケージを入れます。

dotnet new console -o DapperSample
cd DapperSample
dotnet add package Dapper
dotnet add package Microsoft.Data.Sqlite

Dapper が本体、Microsoft.Data.Sqlite が SQLite に接続するためのドライバです。Dapper は特定のDBに縛られず、IDbConnection を実装した接続オブジェクトなら何にでも使えます(後半でPostgreSQL/MySQLにも触れます)。

テーブルとモデルクラスを用意する

今回は「本(Book)」を管理する簡単な例です。まず、結果を受け取るC#のクラス(モデル)を作ります。プロパティ名とSQLの列名を合わせておくと、Dapperが自動でマッピングしてくれます。

public class Book
{
    public int Id { get; set; }
    public string Title { get; set; } = "";
    public int Price { get; set; }
}

次に、接続を開いてテーブルを作ります。Execute はSELECT以外(CREATE/INSERT/UPDATE/DELETE)を実行するメソッドです。

using Microsoft.Data.Sqlite;
using Dapper;

using var conn = new SqliteConnection("Data Source=books.db");
conn.Open();

conn.Execute("""
    CREATE TABLE IF NOT EXISTS Book (
        Id    INTEGER PRIMARY KEY AUTOINCREMENT,
        Title TEXT NOT NULL,
        Price INTEGER NOT NULL
    );
    """);

CRUD:Dapperの基本操作

Create(追加)

Execute にSQLと値を渡します。@Title のような名前付きパラメータを使い、値は匿名オブジェクトで渡すのが基本。こうするとSQLインジェクションを防げるうえ、文字列連結より読みやすくなります。

conn.Execute(
    "INSERT INTO Book (Title, Price) VALUES (@Title, @Price)",
    new { Title = "C#入門", Price = 2800 });

Read(取得)

Query<T> を使うと、結果を IEnumerable<T> として受け取れます。1件だけなら QueryFirstOrDefault<T> が便利です。

// 全件取得
var books = conn.Query<Book>("SELECT * FROM Book");
foreach (var b in books)
    Console.WriteLine($"{b.Id}: {b.Title} ({b.Price}円)");

// 1件だけ(見つからなければ null)
var one = conn.QueryFirstOrDefault<Book>(
    "SELECT * FROM Book WHERE Id = @Id", new { Id = 1 });

Update(更新)/ Delete(削除)

どちらも Execute です。戻り値は「影響を受けた行数」なので、更新できたか確認にも使えます。

int updated = conn.Execute(
    "UPDATE Book SET Price = @Price WHERE Id = @Id",
    new { Id = 1, Price = 3200 });

int deleted = conn.Execute(
    "DELETE FROM Book WHERE Id = @Id", new { Id = 1 });

これだけで、C#からのDB操作がかなりスッキリ書けます。SqlDataReader で1列ずつ取り出していたころに比べると、記述量が大きく減るはずです。

SqlKata と組み合わせて「SQLを組み立てる」

Dapper は「書いたSQLを実行する」のは得意ですが、条件によってWHEREを足したり外したりする動的なSQLの組み立ては自分でやる必要があります。ここで相性がいいのが、以前紹介した SqlKata(C#で使えるSQLクエリビルダー)です。

SqlKataでSQLを安全に組み立て → Dapperで実行、という役割分担ができます。

条件(C#)組立SqlKataSQL+パラメータ実行DapperDB/結果
図2:「組み立てはSqlKata、実行はDapper」。結果はC#オブジェクトに詰められる
using SqlKata;
using SqlKata.Compilers;

var compiler = new SqliteCompiler();

// 価格が3000円以上の本をタイトル順で、をコードで組み立てる
var query = new Query("Book")
    .Where("Price", ">=", 3000)
    .OrderBy("Title");

// SQL文字列とパラメータにコンパイル
var result = compiler.Compile(query);

// Dapper で実行(パラメータもそのまま渡せる)
var books = conn.Query<Book>(result.Sql, result.NamedBindings);

条件を if で足し引きしてもSQLが壊れにくく、文字列連結にありがちなミスやインジェクションのリスクも避けられます。「組み立てはSqlKata、実行はDapper」は、覚えておくと便利な鉄板の組み合わせです。

まとめ

Dapper は、SQLを自分で書きたい人にとって「軽くて速い、ちょうどいいORM」です。ポイントを振り返ります。

  • 結果を受け取るのは Query<T>、それ以外の実行は Execute
  • 値は名前付きパラメータで渡してインジェクションを防ぐ
  • 動的なSQLは SqlKata で組み立て、Dapperで実行すると安全
  • スキーマ管理や自動SQL生成が欲しいなら EF Core が向く

C#のDBアクセスは、生のADO.NET・Dapper・EF Core・SqlKata と選択肢があり、それぞれ得意分野が違います。どれを選ぶかは、次の使い分けガイドで整理しています。

👉 あわせて読みたい:C#でデータベースを扱う完全ガイド(ADO.NET・Dapper・EF Core・SqlKataの使い分け)

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コスト最小で制作をしたいという意識強め(笑)

コメント

コメントする

目次