使用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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章