Dapper 查询自定义列映射

本文介绍了如何在Dapper中实现自定义列映射,通过创建FallbackTypeMapper和ColumnAttributeTypeMapper,配合ICustomDapperColumn接口约束,以及通过反射批量注册映射规则,使Dapper能根据ColumnAttribute自动映射数据库列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        近期有用到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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值