JOIN による複数テーブル結合クエリ

Dapper Query<T1,T2,TReturn>()1対1テーブル結合マッピングを実装します

  1. 構文解説:Query<主エンティティ,関連エンティティ,戻り値エンティティ>(sql, マッピングデリゲート, パラメータ)
  2. マッピングデリゲート:クエリから取得した2つのエンティティを受け取り、関連プロパティを手動で設定した後、主エンティティを返却します
  3. SQLのルール:JOINクエリではカラムを明示的に記述してください。テーブル別名を分け、同名カラムによる競合を防ぐことを推奨します
  4. モデル設計:主エンティティ内に子エンティティのプロパティを定義し、オブジェクトのネストを実現します(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 による複数テーブル結合クエリ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です