ダッパ列名にスペースを入れてSQL列にマップする

c# dapper dapper-rainbow

質問

私は今日何かを手に入れて、小さなサンドボックス/ POCプロジェクトとして走ってきましたが、私の頭を一つの問題に突きつけていたようです...

質問:

そこにスペースがあるSQLカラム名にマップするためのdapperを得る方法はありますか?

私は結果セットとしてこの効果に何かを持っています。

例えば:

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

私のクラスはこのように見えるだろう

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

        public string Col2 { get; set; }

        ///... etc
     }

私の実装は現時点ではこのように見えます

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

注:SQLはどのような方法でも変更できません。

現在、私は大まかなコードを実行しています。私の唯一の予見可能な解決策は、列の比較を「説得する」ためにコードを追加することですが、それまでの運があまりありません。

StackOverflowには、拡張機能のようなものがあることがわかりましたが、拡張機能を追加することなくこれを行うことができると期待しています。私は実装するのが最も速いものを取る。

受け入れられた回答

1つのオプションは、動的/非汎用APIを経由して、行ごとにIDictionary<string,object> APIを介して値を取得することですが、それはちょっと面倒かもしれません。

別の方法として、カスタムマッパーを作成し、それについてdapperに伝えることができます。例えば:

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

with:

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

人気のある回答

列名のマッピング(スペースを含む)を追加できるようにするための小さなパッケージDapper.FluentMapがあります。 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()));

詳細についてはhttps://github.com/henkmollema/Dapper-FluentMapを参照してください



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow