Dapper处理多个结果集与多重映射实例
开始研究如何做到这一点之前,让我们首先试着理解在我们的应用程序中可能希望做到这一点的场景:
- 查询无关实体:所请求的实体根本不相关。
- 查询具有1至多个关系的相关实体:被请求的实体具有1对多的关系,我们需要在代码中处理多个结果集
- 查询具有1至1关系的相关实体:被请求的实体具有1-1关系
我们需要在代码中执行处理多个映射 :
- 在第一个场景中,我们有完全不相关的实体,因此》基本上,我们只想执行两个独立的查询来检索数据,然后将其映射到这些实体。
- 在第二个场景中,返回的实体与1-多相关,因此我们希望检索数据,然后将结果映射到具有1至多个关系的poco中。
- 所有这些都可以通过dapper的查询、querymultiple和read方法进行归档。现在让我们把重点放在如何在代码中执行这些操作。
一、 不相关实体
数据库表
查询结果
二、1至多个关系的相关实体
一个恒星对应多个行星
1.恒星类
public class FixedStar
{
public long Id { get; set; }
public int Fid { get; set; }
public string Name { get; set; }
public List<Planet> Planet { get; set; } = new List<Planet>();
}
2.行星类
public class Planet
{
public long Id { get; set; }
public int Pid { get; set; }
public string Name { get; set; }
public List<Satellite> Satellite { get; set; } = new List<Satellite>();
public FixedStar FixedStar { get; set; }
}
3.数据库数据
4.使用Dapper进行多结果集操作
public async Task<FixedStar> GetMutiStudent()
{
using (var dbconnection = new MySqlConnection(_connectionString))
{
dbconnection.Open();
//查找id为1的恒星,然后查找行星类中对应恒星的行(FixedStarid)
string sql = "SELECT * FROM fixedstar WHERE Id=@Id; SELECT * FROM planet WHERE FixedStarid = @Id;";
using (var multi = await dbconnection.QueryMultipleAsync(sql, new { Id = 1 }))
{
//两个结果集查出来了,然后将行星加入到恒星中的行星集合中,然后返回
var invoice = multi.Read<FixedStar>().First();
var invoiceItems = multi.Read<Planet>().ToList();
invoice.Planet = invoiceItems;
return invoice;
}
}
}