2016-06-15 1 views
1

제목에서 알 수 있듯이 DataReader 개체를 개체 목록에 매핑하려고합니다. 사용중인 코드는 다음과 같습니다. AutoMapper 4.2 automapper가 초기화되면 0.1 및목록에 자동 매핑 IDataReader <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"])); 
      } 
      ); 

3.3.1 그때 나는 내가 매핑

에게 호출이 오류를 반환하지

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)); 
관련 문제