dapper 本身提供了基于Emit mapper 的对象映射,但是对于一对多的关系并不直接支持一对多的对应关系。
我们可以通过使用 Dapper + Slapper.Automapper 实现需要的一对多关系的映射,具体实现过程如下:
1. 使用NuGet安装程序包
在NuGet包管理器中搜索安装Dapper 和 Slapper.Automapper 包
安装Slapper.Autoapper 时需要注意的是如果要支持.net Core 的话需要勾选包含预发行版。
2. 创建实体对象
public partial class MasterBrand
{
public int Id { get; set; }
public string Name { get; set; }
public string OtherName { get; set; }
public string EnglishName { get; set; }
public string Introduction { get; set; }
public List<Make> Makes { get; set; }
}
public partial class Make
{
public int Id { get; set; }
public int? MasterBrandId { get; set; }
public string Name { get; set; }
public string Other_Name { get; set; }
public string Phone { get; set; }
public string Web_Site { get; set; }
public string Introduction { get; set; }
}
3. 对象映射
using (var conn = new SqlConnection(connectionString)) {
Slapper.AutoMapper.Cache.ClearInstanceCache();
var sql = @"select mb.Id,mb.Name,mb.OtherName,mb.EnglishName,mb.Introduction
,m.Id as Makes_ID,m.MasterBrandId as Makes_MasterBrandId,m.Name as Makes_Name,m.OtherName as Makes_Other_Name,m.Phone as Makes_Phone,m.WebSite as Makes_Web_Site,m.Introduction as Makes_Introduction
from MasterBrand mb inner join Make m on mb.Id = m.MasterBrandId";
// 第一步:使用dapper返回动态结果集
dynamic tempResult = conn.Query<dynamic>(sql);
// 第二步:使用Slapper.AutoMapper 添加映射POCO实体的标识符
// 设置所有实体的主键,如果是1:1 的对应关系则使用
// Slapper.AutoMapper.Configuration.AddIdentifier(typeof(Make), "Id");
Slapper.AutoMapper.Configuration.AddIdentifiers(typeof(MasterBrand), new List<string> { "Id" });
Slapper.AutoMapper.Configuration.AddIdentifiers(typeof(Make), new List<string> { "Id" });
// 第三步:将动态结果集转换成对应的实体结果集
var masterBrandList = (Slapper.AutoMapper.MapDynamic<MasterBrand>(tempResult) as IEnumerable<MasterBrand>).Take(1).ToList();
Console.WriteLine(JsonConvert.SerializeObject(masterBrandList));
Console.ReadKey();
}
需要特别注意的是,在进行映射时需要将sql 查询的列用下划线表示("_"),比如MasterBrand 对象的 List Makes。在sql查询语句中需要使用 Makes_Id 来命名,否则无法转换成功,得到的Makes 将会是 null。