Dapper 查询自定义列映射

        近期有用到dapper的自定义列映射,最后在网上找了很多资料,后来完美解决,记录下来,以备不时之需。

1.定义转换类

public class FallbackTypeMapper : SqlMapper.ITypeMap
{
    private readonly IEnumerable<SqlMapper.ITypeMap> _mappers;

    public FallbackTypeMapper(IEnumerable<SqlMapper.ITypeMap> mappers)
    {
        _mappers = mappers;
    }


    public ConstructorInfo FindConstructor(string[] names, Type[] types)
    {
        foreach (var mapper in _mappers)
        {
            try
            {
                ConstructorInfo result = mapper.FindConstructor(names, types);
                if (result != null)
                {
                    return result;
                }
            }
            catch (NotImplementedException)
            {
            }
        }
        return null;
    }

    public SqlMapper.IMemberMap GetConstructorParameter(ConstructorInfo constructor, string columnName)
    {
        foreach (var mapper in _mappers)
        {
            try
            {
                var result = mapper.GetConstructorParameter(constructor, columnName);
                if (result != null)
                {
                    return result;
                }
            }
            catch (NotImplementedException)
            {
            }
        }
        return null;
    }

    public SqlMapper.IMemberMap GetMember(string columnName)
    {
        foreach (var mapper in _mappers)
        {
            try
            {
                var result = mapper.GetMember(columnName);
                if (result != null)
                {
                    return result;
                }
            }
            catch (NotImplementedException)
            {
            }
        }
        return null;
    }


    public ConstructorInfo FindExplicitConstructor()
    {
        return _mappers
            .Select(mapper => mapper.FindExplicitConstructor())
            .FirstOrDefault(result => result != null);
    }
}

public class ColumnAttributeTypeMapper : FallbackTypeMapper
{
    public ColumnAttributeTypeMapper(Type type)
        : base(new SqlMapper.ITypeMap[]
            {
                new CustomPropertyTypeMap(
                   type,
                   (type, columnName) =>
                       type.GetProperties().FirstOrDefault(prop =>
                           prop.GetCustomAttributes(false)
                               .OfType<ColumnAttribute>()
                               .Any(attr => attr.Name == columnName)
                           )
                   ),
                new DefaultTypeMap(type)
            })
    {
    }

}

2. 对需要自定义映射的实体增加接口约束,增加ColumnAttribute,配置映射关系

public interface ICustomDapperColumn
{
}

3. 通过反射批量注册映射规则, 下面这段可在 ConfigureServices 中注册

var assembly = typeof(ICustomDapperColumn).Assembly;
var types = assembly.GetTypes().Where(t => typeof(ICustomDapperColumn).IsAssignableFrom(t) && t.IsClass &&!t.IsAbstract);
foreach (var type in types)
{
    SqlMapper.SetTypeMap(type, new ColumnAttributeTypeMapper(type));
}

4.通过上述注册即可正常使用dapper,会按照上述配置进行自动映射,dapper使用请查看dapper官网。例: 下图 role_id 会被映射为 SysRole的 roleId

最后备注:代码参考了很多个地方,出处有些遗失,就不一样标记出处了。希望能帮到有需要的人

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Dapper是一种轻量级ORM(对象关系映射)工具,它可以将数据库中的数据映射到.NET类型中。Dapper支持自定义属性映射,这使得我们可以将数据库中的映射到.NET类型中的自定义属性上。 Dapper使用`Map`方法来进行自定义属性映射。例如,如果我们有一个名为`Person`的类,它有一个名为`LastName`的自定义属性,我们可以使用以下代码将数据库中的`last_name`映射到该自定义属性上: ```csharp public class Person { public string FirstName { get; set; } [CustomMapping("last_name")] public string LastName { get; set; } } var sql = "SELECT first_name, last_name FROM people WHERE id = @id"; var person = connection.QuerySingleOrDefault<Person>(sql, new { id = 1 }); ``` 在上面的代码中,我们使用了`CustomMapping`属性来标记`LastName`属性,指定它应该映射到数据库中的`last_name`。然后,我们可以使用Dapper的`QuerySingleOrDefault`方法来执行查询并将结果映射到`Person`对象中。 注意,`CustomMapping`属性需要自己实现。下面是一个简单的实现示例: ```csharp [AttributeUsage(AttributeTargets.Property, AllowMultiple = false)] public class CustomMappingAttribute : Attribute { public string ColumnName { get; private set; } public CustomMappingAttribute(string columnName) { ColumnName = columnName; } } ``` 在上面的代码中,`CustomMappingAttribute`是一个自定义属性,它具有一个名为`ColumnName`的属性,用于保存数据库的名称。它还具有一个构造函数,用于设置`ColumnName`属性的值。这样,我们就可以在`Person`类中使用`CustomMapping`属性来指定属性应该映射到哪个

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值