JOIN 多表关联查询

Dapper Query<T1,T2,TReturn>() 实现一对一表连接映射

  1. 语法说明:Query<主实体,关联实体,返回实体>(sql, 映射委托, 参数)
  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; }
    // 嵌套关联对象:一本书归属一个客户(一对一)
    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个:第一个表映射类型 Book
  • 第2个:第二个表映射类型 Customers
  • 第3个:最终返回的数据类型 Book

Previous:

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注