【问题标题】:Automapper IDataReader to List<T> - Missing type map configuration or unsupported mappingAutomapper IDataReader to List<T> - 缺少类型映射配置或不支持的映射
【发布时间】:2016-06-15 13:40:54
【问题描述】:

正如标题所示,我正在尝试将 DataReader 对象映射到对象列表,这是我正在使用的代码,我已经使用 AutoMapper 4.2.1 和 3.3.1 进行了尝试

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"]));
            }
            );

自动映射器初始化后,我会使用

进行验证
Mapper.AssertConfigurationIsValid();

这不会返回错误,然后我调用映射

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

但是这会返回错误

{"缺少类型映射配置或不支持的映射。 映射类型: IDataReader -> IList1 System.Data.IDataReader -> System.Collections.Generic.IList1[[MemberChangesDto,模型, 版本=1.0.0.0,文化=中性, PublicKeyToken=null]] 目的地路径: 列表`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 导致了这里的问题。

提前致谢。

【问题讨论】:

    标签: c# mapping automapper datareader 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));
    

    【讨论】:

      猜你喜欢
      • 2019-03-01
      • 2017-04-16
      • 2015-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-15
      • 2015-05-07
      • 1970-01-01
      相关资源
      最近更新 更多