Dapper.NET 自定义映射
示例
如果查询列名称与您的类不匹配,则可以设置类型的映射。此示例演示了使用System.Data.Linq.Mapping.ColumnAttribute以及自定义映射的映射。
每种类型的映射仅需要设置一次,因此可以在应用程序启动时或在其他地方设置它们,使其仅初始化一次。
再次假设查询与一对多示例相同,并且将类重构为更好的名称,如下所示:
public class Person { public int Id { get; set; } public string Name { get; set; } public int Born { get; set; } public Country Residience { get; set; } public ICollection<Book> Books { get; set; } } public class Country { [System.Data.Linq.Mapping.Column(Name = "CountryId")] public int Id { get; set; } [System.Data.Linq.Mapping.Column(Name = "CountryName")] public string Name { get; set; } } public class Book { public int Id { get; set; } public string Name { get; set; } }
注意如何Book不依赖,ColumnAttribute但我们需要维护该if语句
现在,将此映射代码放置在应用程序中仅执行一次的位置:
Dapper.SqlMapper.SetTypeMap( typeof(Country), new CustomPropertyTypeMap( typeof(Country), (type, columnName) => type.GetProperties().FirstOrDefault(prop => prop.GetCustomAttributes(false) .OfType<System.Data.Linq.Mapping.ColumnAttribute>() .Any(attr =>attr.Name== columnName))) ); var bookMap = new CustomPropertyTypeMap( typeof(Book), (type, columnName) => { if(columnName == "BookId") { return type.GetProperty("Id"); } if (columnName == "BookName") { return type.GetProperty("Name"); } throw new InvalidOperationException($"No matching mapping for {columnName}"); } ); Dapper.SqlMapper.SetTypeMap(typeof(Book), bookMap);
然后使用前面的任何Query<>示例执行查询。
此答案中显示了一种添加映射的更简单方法。