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

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。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值