使用Dapper + Slapper.Automapper 实现一对多映射

dapper 本身提供了基于Emit mapper 的对象映射,但是对于一对多的关系并不直接支持一对多的对应关系。
我们可以通过使用 Dapper + Slapper.Automapper 实现需要的一对多关系的映射,具体实现过程如下:

1. 使用NuGet安装程序包
在NuGet包管理器中搜索安装Dapper 和 Slapper.Automapper 包
使用Dapper + Slapper.Automapper 实现一对多映射_第1张图片
安装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 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(sql);
                // 第二步:使用Slapper.AutoMapper 添加映射POCO实体的标识符
                // 设置所有实体的主键,如果是1:1 的对应关系则使用
                // Slapper.AutoMapper.Configuration.AddIdentifier(typeof(Make), "Id");
                Slapper.AutoMapper.Configuration.AddIdentifiers(typeof(MasterBrand), new List { "Id" });
                Slapper.AutoMapper.Configuration.AddIdentifiers(typeof(Make), new List { "Id" });
				// 第三步:将动态结果集转换成对应的实体结果集
                var masterBrandList = (Slapper.AutoMapper.MapDynamic(tempResult) as IEnumerable).Take(1).ToList();

                Console.WriteLine(JsonConvert.SerializeObject(masterBrandList));
                Console.ReadKey();
            }

需要特别注意的是,在进行映射时需要将sql 查询的列用下划线表示("_"),比如MasterBrand 对象的 List Makes。在sql查询语句中需要使用 Makes_Id 来命名,否则无法转换成功,得到的Makes 将会是 null。

你可能感兴趣的:(asp.net)