Apuesto. Mapa de la columna SQL con espacios en los nombres de las columnas

c# dapper dapper-rainbow

Pregunta

Me las he arreglado para hacer funcionar algo hoy como un pequeño proyecto de espacio aislado / POC, pero parece que me he encontrado con un problema ...

Pregunta:

¿Hay alguna manera de hacer que dapper se correlacione con nombres de columna SQL con espacios en ellos?

Tengo algo en este sentido como mi conjunto de resultados.

Por ejemplo:

SELECT 001 AS [Col 1], 
       901 AS [Col 2],
       00454345345345435349 AS [Col 3],
       03453453453454353458 AS [Col 4] 
FROM [Some Schema].[Some Table]

Y mi clase se vería así

    public class ClassA
    {          
        public string Col1 { get; set; }    

        public string Col2 { get; set; }

        ///... etc
     }

Mi implementación se ve así en este momento

 public Tuple<IList<TClass>, IList<TClass2>> QueryMultiple<TClass, TClass2>(object parameters)
 {
      List<TClass> output1;
      List<TClass2> output2;

      using (var data = this.Connection.QueryMultiple(this.GlobalParameter.RpcProcedureName, parameters, CommandType.StoredProcedure))
      {
           output1 = data.Read<TClass>().ToList();
           output2 = data.Read<TClass2>().ToList();
      }

      var result = new Tuple<IList<TClass>, IList<TClass2>>(output1, output2);
      return result;
  }

Nota: El SQL no se puede modificar de ninguna manera.

Actualmente estoy revisando el código apuesto, y mi única solución previsible es agregar algún código para "persuadir" la comparación de columnas, pero sin mucha suerte hasta el momento.

He visto en StackOverflow que hay cosas como extensiones aptas, pero espero poder hacerlo sin agregar una extensión, de lo contrario. Tomaré lo que sea más rápido de implementar.

Respuesta aceptada

Una opción aquí sería ir a través de la API dinámica / no genérica, y luego recuperar los valores a través de la IDictionary<string,object> por fila, pero eso podría ser un poco tedioso.

Como alternativa, puede crear un asignador personalizado y contarle a dapper sobre eso; por ejemplo:

SqlMapper.SetTypeMap(typeof(ClassA), new RemoveSpacesMap());

con:

class RemoveSpacesMap : Dapper.SqlMapper.ITypeMap
{

    System.Reflection.ConstructorInfo SqlMapper.ITypeMap.FindConstructor(string[] names, Type[] types)
    {
        return null;
    }

    SqlMapper.IMemberMap SqlMapper.ITypeMap.GetConstructorParameter(System.Reflection.ConstructorInfo constructor, string columnName)
    {
        return null;
    }

    SqlMapper.IMemberMap SqlMapper.ITypeMap.GetMember(string columnName)
    {
        var prop = typeof(ClassA).GetProperty(columnName.Replace(" ", ""));
        return prop == null ? null : new PropertyMemberMap(columnName, prop);
    }
    class PropertyMemberMap : Dapper.SqlMapper.IMemberMap
    {
        private string columnName;
        private PropertyInfo property;
        public PropertyMemberMap(string columnName, PropertyInfo property)
        {
            this.columnName = columnName;
            this.property = property;
        }
        string SqlMapper.IMemberMap.ColumnName
        {
            get { throw new NotImplementedException(); }
        }

        System.Reflection.FieldInfo SqlMapper.IMemberMap.Field
        {
            get { return null; }
        }

        Type SqlMapper.IMemberMap.MemberType
        {
            get { return property.PropertyType; }
        }

        System.Reflection.ParameterInfo SqlMapper.IMemberMap.Parameter
        {
            get { return null; }
        }

        System.Reflection.PropertyInfo SqlMapper.IMemberMap.Property
        {
            get { return property; }
        }
    }
}

Respuesta popular

Hay un paquete nuget Dapper.FluentMap que le permite agregar asignaciones de nombre de columna (incluidos los espacios). Es similar a EntityFramework.

// Entity class.
public class Customer
{
    public string Name { get; set; }
}

// Mapper class.
public class CustomerMapper : EntityMap<Customer>
{
    public CustomerMapper()
    {
        Map(p => p.Name).ToColumn("Customer Name");
    }
}

// Initialise like so - 
FluentMapper.Initialize(a => a.AddMap(new CustomerMapper()));

consulte https://github.com/henkmollema/Dapper-FluentMap para obtener más información.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow