Architect's Log

I'm a Cloud Architect. I'm highly motivated to reduce toils with driving DevOps.

【Dapper】Dapperでパラメーターを使用する

Dapperでパラメーターを使用してみます。

ソースコード

Person.cs

using System.Text;

namespace DapperSample {
    class Person {
        public int ID { get; set; }

        public string Name { get; set; }

        public int Age { get; set; }

        public override string ToString() {
            StringBuilder b = new StringBuilder();
            b.AppendFormat("ID:[{0}] ", this.ID);
            b.AppendFormat("Name:[{0}] ", this.Name);
            b.AppendFormat("Age:[{0}] ", this.Age);
            return b.ToString();
        }
    }
}

Program.cs

Queryメソッドの第2引数でパラメーターを渡します。仮引数の型はobjectなので、実引数には自分で定義したクラスのインスタンスを渡すことができます。
プロパティ名をパラメーター名に合わせる必要があります。

using Dapper;
using System;
using System.Data.SqlClient;

namespace DapperSample {
    class Parameters {
        public int Age { get; set; }
    }

    class Program {
        static void Main(string[] args) {
            using (SqlConnection connection = new SqlConnection([接続文字列])) {
                connection.Open();

                var persons = connection.Query<Person>(
                    "SELECT ID, Name, Age FROM dbo.Persons WHERE Age = @Age ORDER BY ID", 
                    new Parameters() { Age = 20 });

                foreach (Person person in persons) {
                    Console.WriteLine(person);
                }
            }

            Console.ReadKey();
        }
    }
}

動作結果

f:id:JHashimoto:20160313194236p:plain

パラメータークラスを匿名型にする

パラメーター用のクラスを毎回定義するのは面倒なので、匿名型にすることができます。これでも同じように動作します。

using Dapper;
using System;
using System.Data.SqlClient;

namespace DapperSample {
    class Program {
        static void Main(string[] args) {
            using (SqlConnection connection = new SqlConnection([接続文字列])) {
                connection.Open();

                var persons = connection.Query<Person>(
                    "SELECT ID, Name, Age FROM dbo.Persons WHERE Age = @Age ORDER BY ID", 
                    new { Age = 20 });

                foreach (Person person in persons) {
                    Console.WriteLine(person);
                }
            }

            Console.ReadKey();
        }
    }
}