C# 要列出的Automapper IDataReader<;T>;-缺少类型映射配置或不支持的映射

C# 要列出的Automapper IDataReader<;T>;-缺少类型映射配置或不支持的映射,c#,mapping,automapper,datareader,idatareader,C#,Mapping,Automapper,Datareader,Idatareader,正如标题所示,我正在尝试将DataReader对象映射到对象列表,下面是我正在使用的代码,我已经使用AutoMapper 4.2.1和3.3.1进行了尝试 Mapper.Initialize(cfg => { cfg.CreateMap<IDataReader, MemberChangesDto>() .ForMember(dest => dest.M

正如标题所示,我正在尝试将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"]));
            }
            );
这不会返回任何错误,然后我调用映射

IDataReader dataTableReader = memberChangesDS.Tables[2].CreateDataReader();
IList<MemberChangesDto> members = Mapper.Map<IList<MemberChangesDto>>(dataTableReader);
有人能给我指出正确的方向吗?我在一个对象到另一个对象之间使用了AutoMapper,没有问题,但是我认为IDataReader造成了这个问题


提前感谢。

此方法不使用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>();
    }
public IEnumerable FillDataRows(字符串查询,参数SqlParameter[]sqlParams){
var properties=typeof(T).GetProperties().ToList();
IList结果=新列表();
var source=FillDataRows(查询,sqlParams.ToList();
var firstInSource=source.FirstOrDefault();
if(firstInSource==null)
返回结果;
//删除源中不存在的属性
properties.RemoveAll(p=>firstInSource.Table.Columns.Contains(p.Name)==false);
foreach(源中的变量行){
var item=createItemFromRow((DataRow)行,属性);
结果.添加(项目);
}
返回结果;
}
私有T createItemFromRow(DataRow行,IList属性){
T item=Activator.CreateInstance();
foreach(属性中的var属性){
if(行[property.Name]!=System.DBNull.Value)
property.SetValue(项,行[property.Name],null);
}
退货项目;
} 
公共void FillDataSet(数据集ds、字符串数据表、字符串查询、参数SqlParameter[]sqlParams){
使用(var cn=new-SqlConnection(this.connectionString)){
cn.Open();
使用(var cmd=cn.CreateCommand()){
cmd.CommandTimeout=CommandTimeout;
cmd.CommandText=查询;
if(sqlParams!=null&&sqlParams.Length>0)
cmd.Parameters.AddRange(sqlParams);
使用(var adapter=new System.Data.SqlClient.SqlDataAdapter(cmd)){
适配器填充(ds,数据表);
}
}
cn.Close();
}
}
公共IEnumerable FillDataRows(字符串查询,参数SqlParameter[]sqlParams){
var ds=新数据集();
FillDataSet(ds,“结果”、查询、sqlParams);
返回ds.Tables[“Result”].Rows.OfType();
}
样本:

var sql = "select MemberNo = Member_No, OrganisationName = Member_Name ... From MYTABLES where Member_No = @ID"; 
var results = FillDataRows<MemberChangesDto>(sql, new SqlParameter("@ID", 12345));
var sql=“从MYTABLES中选择MemberNo=Member\u No,OrganizationName=Member\u Name…,其中Member\u No=@ID”;
var results=FillDataRows(sql,新的SqlParameter(“@ID”,12345));
   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));