Dapper 多表关联查询

Dapper 对数据库进行查询取值,映射到多个实体类

Posted by Trojan on June 11, 2019

Dapper 多表关联查询

首先有3个实体类,对应着数据库里面的字段

/// <summary>
/// 学生
/// </summary>
public class Student {
    public int ID { get; set; }
    public string Name { get; set; }
    public int GradeID { get; set; }
    public int InformationID { get; set; }
}
/// <summary>
/// 班级
/// </summary>
public class Grade {
    public int ID { get; set; }
    public string Name { get; set; }
}
/// <summary>
/// 重要信息,通过加密进行存储
/// </summary>
public class Information {
    public int ID { get; set; }
    public string IDCard { get; set; }
    public string Phone { get; set; }
}

然后进行查询的SQL语句

SELECT * FROM Student 
LEFT JOIN Grade ON Grade.ID = Student.GradeID
LEFT JOIN Information ON Information.ID = Student.InformationID

在Dapper里面进行如何将多张表取出呢?

第一种方法

建立一个新的 model

public class StudentViewModel {
    public Student Student { get; set; }
    public Grade Grade { get; set; }
    public Information Information { get; set; }
}

这样就取出来了

var studentViews = connection.Query<Student,Grade,Information,StudentViewModel>(sql,(student,greade,information)=>
{
    var obj = new StudentViewModel();
    obj.Student=student;
    obj.Grade=greade;
    obj.Information=information;
    return obj;
},splitOn:"ID");

解释一下Query的参数 <> 里面前面几个是你的实体类 最后一个是你要输出的类型,然后委托里面是你是你实体类的数量,对应着你的每个实体类。splitOn: 根据哪个字符进行分割, 简单的说就是你每个实体在数据库查询出来的第一列。这里因为每个都是ID开头的,所以写一个ID就可以了,如果有多个的话使用 , 隔开 例如 “ID,Name”.

第二种方法

var studentViews = connection.Query<Student,Grade,Information,(Student,Grade,Information)>(sql,(student,greade,information)=>
{
    return (student,greade,information);
},splitOn:"ID");

emmmmm , dotnet core 里面可以使用, framework 的话好像不支持这种语法.


参考