Pimpant. Mapper à la colonne SQL avec des espaces dans les noms de colonne

c# dapper dapper-rainbow

Question

J'ai réussi à obtenir quelque chose de opérationnel aujourd'hui en tant que petit projet sandbox / POC, mais j'ai semblé me ​​cogner la tête sur un problème ...

Question:

Existe-t-il un moyen d'obtenir que Dapper mappe les noms de colonnes SQL avec des espaces.

J'ai quelque chose à cet effet en tant que résultat.

Par exemple:

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

Et ma classe ressemblerait à ceci

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

        public string Col2 { get; set; }

        ///... etc
     }

Ma mise en œuvre ressemble à ceci pour le moment

 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;
  }

Note: Le SQL ne peut être modifié en aucune façon.

Actuellement, je passe en revue le code dapper, et ma seule solution prévisible est d'ajouter du code pour "persuader" la comparaison des colonnes, mais sans avoir beaucoup de chance jusqu'à présent.

J'ai vu sur StackOverflow qu'il y a des choses comme des extensions dapper, mais j'espère que je peux y arriver sans ajouter d'extention, sinon. Je vais prendre tout ce qui est le plus rapide à mettre en œuvre.

Réponse acceptée

Une option serait de passer par l’API dynamique / non générique, puis d’extraire les valeurs via l’API IDictionary<string,object> par ligne, mais cela pourrait être un peu fastidieux.

Vous pouvez également créer un mappeur personnalisé et en parler à dapper. par exemple:

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

avec:

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; }
        }
    }
}

Réponse populaire

Il existe un package nuget Dapper.FluentMap qui vous permet d’ajouter des mappages de noms de colonnes (espaces compris). C'est similaire à 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()));

voir https://github.com/henkmollema/Dapper-FluentMap pour plus.




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi