2016-06-15 2 views
1

タイトルが示すように、DataReaderオブジェクトをオブジェクトのリストにマップしようとしていますが、これは私が使用しているコードです。AutoMapper 4.2 0.1および3.3.1Automapper IDataReader to List <T> - タイプマップの設定が欠落しているか、サポートされていないマッピング

Mapper.Initialize(cfg => 
      { 
       cfg.CreateMap<IDataReader, MemberChangesDto>()     
       .ForMember(dest => dest.MemberNo, opt => opt.MapFrom(src => (string)src["Member_No"])) 
       .ForMember(dest => dest.OrganisationName, opt => opt.MapFrom(src => (string)src["Member_Name"])) 
       .ForMember(dest => dest.MemberJoinDate, opt => opt.MapFrom(src => (string)src["Membership_StartDate"])) 
       .ForMember(dest => dest.ResignationDate, opt => opt.MapFrom(src => (string)src["Membership_Resigned_Date"])) 
       .ForMember(dest => dest.MemberStatusId, opt => opt.MapFrom(src => (string)src["Membership_Status_Code"])); 
      } 
      ); 

automapperが、私はこれは、私は

マッピングを呼び出し、エラーが返されない

Mapper.AssertConfigurationIsValid(); 

を使用して、それを検証する初期化されると

IDataReader dataTableReader = memberChangesDS.Tables[2].CreateDataReader(); 
IList<MemberChangesDto> members = Mapper.Map<IList<MemberChangesDto>>(dataTableReader); 

しかし、これはエラー

{「欠落型マップ設定またはサポートされていないマッピングを返します。 マッピングタイプ: たIDataReader - > IListの1 System.Data.IDataReader -> System.Collections.Generic.IList 1 [[MemberChangesDto、モデル、 バージョン= 1.0.0.0、文化=中立、 なPublicKeyToken = nullを]] 先のパス: IList`1 ソース値:System.Data。 DataTableReader "}

私はこのようなルックスにマップしようとしているオブジェクト。

public class MemberChangesDto 
{ 
    public string MemberNo { get; set; } 
    public string OrganisationName { get; set; } 
    public string MemberJoinDate { get; set; } 
    public string ResignationDate { get; set; } 
    public string MemberStatusId { get; set; } 
} 

誰もが正しい方向に私を指すことができ、私は時間、何の問題もなくオブジェクトへのオブジェクトからAutoMapperを使用していました私はIDataReaderがここで問題を引き起こしていると考えています。

ありがとうございます。

答えて

1

この方法はAutoMapper使用していないSQLクエリからのオブジェクトのインスタンスを作成します。

public IEnumerable<T> FillDataRows<T>(String query, params SqlParameter[] sqlParams) { 
     var properties = typeof(T).GetProperties().ToList(); 
     IList<T> result = new List<T>(); 

     var source = FillDataRows(query, sqlParams).ToList(); 
     var firstInSource = source.FirstOrDefault(); 
     if (firstInSource == null) 
      return result; 

     //remove properties not exist in source 
     properties.RemoveAll(p => firstInSource.Table.Columns.Contains(p.Name) == false); 

     foreach (var row in source) { 
      var item = createItemFromRow<T>((DataRow)row, properties); 
      result.Add(item); 
     } 

     return result; 
    } 

    private T createItemFromRow<T>(DataRow row, IList<PropertyInfo> properties) { 
     T item = Activator.CreateInstance<T>(); 
     foreach (var property in properties) { 
      if (row[property.Name] != System.DBNull.Value) 
       property.SetValue(item, row[property.Name], null); 
     } 
     return item; 
    } 

    public void FillDataSet(DataSet ds, String dataTable, String query, params SqlParameter[] sqlParams) { 
     using (var cn = new SqlConnection(this.connectionString)) { 
      cn.Open(); 
      using (var cmd = cn.CreateCommand()) { 
       cmd.CommandTimeout = commandTimeout; 
       cmd.CommandText = query; 
       if (sqlParams != null && sqlParams.Length > 0) 
        cmd.Parameters.AddRange(sqlParams); 
       using (var adapter = new System.Data.SqlClient.SqlDataAdapter(cmd)) { 
        adapter.Fill(ds, dataTable); 
       } 
      } 
      cn.Close(); 
     } 
    } 

    public IEnumerable<DataRow> FillDataRows(String query, params SqlParameter[] sqlParams) { 
     var ds = new DataSet(); 
     FillDataSet(ds, "Result", query, sqlParams); 
     return ds.Tables["Result"].Rows.OfType<DataRow>(); 
    } 

サンプル:

var sql = "select MemberNo = Member_No, OrganisationName = Member_Name ... From MYTABLES where Member_No = @ID"; 
var results = FillDataRows<MemberChangesDto>(sql, new SqlParameter("@ID", 12345)); 
関連する問題