Dapper Query<T1,T2,TReturn>() は1対1テーブル結合マッピングを実装します
- 構文解説:
Query<主エンティティ,関連エンティティ,戻り値エンティティ>(sql, マッピングデリゲート, パラメータ) - マッピングデリゲート:クエリから取得した2つのエンティティを受け取り、関連プロパティを手動で設定した後、主エンティティを返却します
- SQLのルール:
JOINクエリではカラムを明示的に記述してください。テーブル別名を分け、同名カラムによる競合を防ぐことを推奨します - モデル設計:主エンティティ内に子エンティティのプロパティを定義し、オブジェクトのネストを実現します(BookにCustomerを保持)
サンプル
1. エンティティクラス定義
public class Customers
{
public int CustomerID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
}
public class Book
{
public int ID { get; set; }
public string Title { get; set; }
// ネストされた関連オブジェクト:1冊の書籍は1人の顧客に紐付く(1対1)
public Customers Customer { get; set; }
}Code language: C# (cs)
2. クエリ処理
using System.Data;
using MySql.Data.MySqlClient;
using Dapper;
using System.Configuration;
class Program
{
static void Main(string[] args)
{
var connStr = ConfigurationManager.ConnectionStrings["CustomerConnection"].ConnectionString;
using (IDbConnection connection = new MySqlConnection(connStr))
{
var sql = @"select b.*,c.CustomerID,c.FirstName,c.LastName,c.Email
from Customers as c
join Book as b
on c.CustomerID = b.CID
where b.ID = @id;";
var result = connection.Query<Book, Customers, Book>(
sql,
(book, custom) =>
{
// ネストオブジェクトを手動で代入
book.Customer = custom;
return book;
},
new { id = 1 }
);
}
Console.ReadKey();
}
}Code language: C# (cs)
注意:ジェネリック
Query<Book, Customers, Book>
- 1つ目:1番目のテーブルのマッピング型 Book
- 2つ目:2番目のテーブルのマッピング型 Customers
- 3つ目:最終的に返却するデータ型 Book
JOIN による複数テーブル結合クエリ
Previous: 複数ステートメント操作