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。