Sweets Junkie

もぅマヂ無理。ムズかしぃコト。。。ぉぼぇてらんなぃから。。。ブログかコ。。。デザィンみづらくてぇ。。。それどころじゃなぃ。。。

【C#】Dapper Extensions を使おう!

Dapper Extensions は、Dapperで簡単なCRUD操作を可能としてくれる軽量で素敵なライブラリです。 基本的な使い方は以下のgithubページにまとまっていますが、自分なりにポイントをまとめます。

https://github.com/tmsmith/Dapper-Extensions

まず前提として以下のようなテーブルを操作すると仮定して説明します。 テーブル名:Users カラム:UserId, Name, Age, Sex

マッピングクラスを準備する

テーブル名と同じ名前でクラスを準備します。 別名にすることもできますが、その方法については別途記載します。

class Users
{
    public int UserId { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
    public string Sex { get; set; }
}

GET操作

主キーで検索する

主キー検索は引数に主キーの値を設定します。 ちなみにマッピングクラス内で最初に登場する"id"がつく変数を主キーとして認識します。

using (var connection = new SqlConnection("接続文字列"))
{
    connection.Open();
    // GET 引数にUserIdを指定
    var user = connection.Get<Users>(1);
}

主キー以外で検索する

主キー以外で検索する場合は、検索条件をPredicatesに設定してからおこないます。

using (var connection = new SqlConnection("接続文字列"))
{
    connection.Open();
    // 検索条件を作成
    var predicate = Predicates.Field<Users>(f => f.Name, Operator.Eq, "神谷浩史");
    // GET 引数に検索条件を設定
    // FirstOrDefault で先頭の検索結果のみ取得
    var user = connection.GetList<Users>(predicate).FirstOrDefault();
}

複数条件指定で検索する

複数条件設定する場合は、PredicateGroupを作ります。

using (var connection = new SqlConnection("接続文字列"))
{
    connection.Open();
    // 検索条件を作成
    var pg = new PredicateGroup { Operator = GroupOperator.And, Predicates = new List<IPredicate>() };
    pg.Predicates.Add(Predicates.Field<Users>(f => f.Age, Operator.Eq, 20));
    pg.Predicates.Add(Predicates.Field<Person>(f => f.Sex, Operator.Eq, "男"));

    // GET 引数に検索条件を設定
    var users = connection.GetList<Users>(pg);
}

INSERT操作

Insertする場合は、マッピングクラスに値を設定してInsertメソッドに渡すだけです。 この例では主キーがidentityですが、identityでない場合は別の機会に説明します。

using (var connection = new SqlConnection("接続文字列"))
{
    connection.Open();
    // INSERTする値を設定
    var user = new Users
    {
        Name = "神谷浩史",
        Sex = "男"
    };
    // INSERT
    // identity の値が返ってくる
    var id = connection.Insert(user);
}

UPDATE操作

Updateする場合もマッピングクラスに値を設定してUpdateメソッドに渡すだけです。 ただし全てのカラムを更新するので、直前で現在のDBの値を取得してから更新しましょう。

using (var connection = new SqlConnection("接続文字列"))
{
    connection.Open();
    // 現在の値を取得して、更新する値を設定
    var user = connection.Get<Users>(1);
    user.Age = 40;
    // UPDATE
    connection.Update(user);
}

DELETE操作

Deleteする場合はマッピングクラスに主キーを設定してDeleteメソッドに渡すだけです。

using (var connection = new SqlConnection("接続文字列"))
{
    connection.Open();
    // 主キーを設定
    var user = new Users { UserId = 1 };
    // DELETE
    connection.Delete(user);
}

基本的な使い方は以上です。 非常に簡単に使い始めることができ、Dapperをさらに使いやすくしてくれます。

今回は説明しませんでしたが、マッピングクラスとテーブル名が異なる場合や、主キーをIdentityとしない場合でもDapper Extensionsを使用することができます。 これらの実装方法についてはまた別の機会にまとめようと思います。