Dapperの使い方のメモ
まずはデータを用意しないと試すことができないので、MicrosoftがAdventureWorksという架空の会社を想定したデータを公開しているので
SQL Serverをつかいます
Dapperの使い方のメモ
まずはデータを用意しないと試すことができないので、MicrosoftがAdventureWorksという架空の会社を想定したデータを公開しているので
SQL Serverをつかいます
DataBaseは、SQL Serverで、データはAdventureWorks2022をいれています
→AdventureWorksについて
複数のSQLを1リクエストで投げて、結果を受け取るため
を使います
そこから得た結果に対し、それぞれのSQLで取得されるであろう結果のレコード数に応じて以下を使い分ける感じ
| メソッド | 0件 | 1件 | 2件以上 | 
|---|---|---|---|
| Read | 0件 | レコード | 複数レコード | 
| ReadSingleOrDefault | null | レコード | 例外発生 | 
| ReadSingle | null | レコード | 例外発生 | 
| ReadFirstOrDefault | null | レコード | 最初のレコード | 
| ReadFirst | 例外発生 | レコード | 最初のレコード | 
※Asyncをつければ非同期版
※Singleは結果が1行じゃないと例外発生、Firstは最初の1行だけ返す
サンプル:
1回のリクエストで男性女性わけてデータを取り出す例
Employee.cs
namespace SampleDapper.Models.HumanResources
{
    public class Employee
    {
        // テーブルから取得したい列の情報を定義
        public int BusinessEntityID { get; set; }
        public string JobTitle { get; set; } = null!;
        public DateTime BirthDate { get; set; }
        public char Gender { get; set; }
        public DateTime HireDate { get; set; }
    }
}
Program.cs
using Dapper;
using Microsoft.Data.SqlClient;
using Microsoft.Extensions.Configuration;
using SampleDapper.Models.HumanResources;
try
{
    var config = new ConfigurationBuilder()
                    .SetBasePath(Directory.GetCurrentDirectory())
                    .AddJsonFile(@"appsettings.json")
                    .Build();
    var connectStr = config["ConnectionStrings:DefaultConnection"];
    using (var connection = new SqlConnection(connectStr))
    {
        connection.Open();
        // 任意の件数、取得するSQL
        var sql = @"
                    SELECT * FROM HumanResources.Employee WHERE Gender = @Gender1;
                    SELECT * FROM HumanResources.Employee WHERE Gender = @Gender2;
                   ";
        // SQL中のパラメータに渡す値を設定
        var parameters = new { Gender1 = 'F', Gender2 = 'M' };
        using (var multi = connection.QueryMultiple(sql, parameters))
        {
            var femaleEmployees = multi.Read<Employee>();
            var maleEmployees = multi.Read<Employee>();
        }
    }
}
catch(Exception ex)
{
    Console.Write(ex.ToString());
}
DataBaseは、SQL Serverで、データはAdventureWorks2022をいれています
→AdventureWorksについて
複数データが返ってくる場合は、以下メソッドを使います
サンプル:
Employee.cs
namespace SampleDapper.Models.HumanResources
{
    public class Employee
    {
        // テーブルから取得したい列の情報を定義
        public int BusinessEntityID { get; set; }
        public string JobTitle { get; set; } = null!;
        public DateTime BirthDate { get; set; }
        public char Gender { get; set; }
        public DateTime HireDate { get; set; }
    }
}
Program.cs
using Dapper;
using Microsoft.Data.SqlClient;
using Microsoft.Extensions.Configuration;
using SampleDapper.Models.HumanResources;
try
{
    var config = new ConfigurationBuilder()
                    .SetBasePath(Directory.GetCurrentDirectory())
                    .AddJsonFile(@"appsettings.json")
                    .Build();
    var connectStr = config["ConnectionStrings:DefaultConnection"];
    using (var connection = new SqlConnection(connectStr))
    {
        connection.Open();
        // 任意の件数、取得するSQL
        var sql = "SELECT * FROM HumanResources.Employee WHERE Gender = @Gender AND JobTitle = @JobTitle";
        // SQL中のパラメータに渡す値を設定
        var parameters = new { Gender = 'F', JobTitle = "Design Engineer" };
        var recordList = connection.Query<Employee>(sql, parameters);
    }
}
catch(Exception ex)
{
    Console.Write(ex.ToString());
}
DataBaseは、SQL Serverで、データはAdventureWorks2022をいれています
→AdventureWorksについて
主キーで絞り込みのように1行データを取得する場合
| メソッド | 0件 | 1件 | 2件以上 | 
|---|---|---|---|
| QuerySingle | 例外発生 | レコード | 例外発生 | 
| QuerySingleOrDefault | null | レコード | 例外発生 | 
| QueryFirst | null | レコード | 最初のレコード | 
※Asyncをつければ非同期版
サンプル:
Employee.cs
namespace SampleDapper.Models.HumanResources
{
    public class Employee
    {
        // テーブルから取得したい列の情報を定義
        public int BusinessEntityID { get; set; }
        public string JobTitle { get; set; } = null!;
        public DateTime BirthDate { get; set; }
        public char Gender { get; set; }
        public DateTime HireDate { get; set; }
    }
}
Program.cs
using Dapper;
using Microsoft.Data.SqlClient;
using Microsoft.Extensions.Configuration;
using SampleDapper.Models.HumanResources;
try
{
    var config = new ConfigurationBuilder()
                    .SetBasePath(Directory.GetCurrentDirectory())
                    .AddJsonFile(@"appsettings.json")
                    .Build();
    var connectStr = config["ConnectionStrings:DefaultConnection"];
    using (var connection = new SqlConnection(connectStr))
    {
        connection.Open();
        // 主キーで1件取得するSQL
        var sql = "SELECT * FROM HumanResources.Employee WHERE BusinessEntityID = @BusinessEntityID";
        // SQL中のパラメータに渡す値を設定
        var parameters = new { BusinessEntityID = 36 };
        var record = connection.QuerySingle<Employee>(sql, parameters);
    }
}
catch(Exception ex)
{
    Console.Write(ex.ToString());
}
DataBaseは、SQL Serverで、データはAdventureWorks2022をいれています
→AdventureWorksについて
Count、Sum、Avg、Max、Minなどの1データ取得する場合に以下メソッドを使用します
サンプル:
using Dapper;
using Microsoft.Data.SqlClient;
using Microsoft.Extensions.Configuration;
try
{
    var config = new ConfigurationBuilder()
                    .SetBasePath(Directory.GetCurrentDirectory())
                    .AddJsonFile(@"appsettings.json")
                    .Build();
    var connectStr = config["ConnectionStrings:DefaultConnection"];
    using (var connection = new SqlConnection(connectStr))
    {
        connection.Open();
        var sql = "SELECT COUNT(*) FROM HumanResources.Employee";
        var count = connection.ExecuteScalar<int>(sql);
    }
}
catch(Exception ex)
{
    Console.Write(ex.ToString());
}