2017-02-16 53 views
0

使用automapperado.netasp.net core中的通用方式的正確方法是什麼? 此外,Sql查詢具有與<T>類中相同的列名稱 在指定的示例變量result始終爲空列表,因此automapper無法將對象屬性映射到DbDataReader列。使用ADO.NET和AutoMapper的ASP.NET CORE

public class CustomDbContext : BaseRepository 
{ 
    readonly DbConnection dbConn; 
    public CustomDbContext(RepoDbContext context) : base(context) 
    { 
     dbConn = context.Database.GetDbConnection(); 
    } 

    public async Task<List<T>> Get<T>(string sql) where T : class 
    { 
     var config = new AutoMapper.MapperConfiguration(cfg => 
     { 
      cfg.CreateMap<DbDataReader, List<T>>(); 
     }); 

     var mapper = config.CreateMapper(); 
     await dbConn.OpenAsync(); 
     using (var command = dbConn.CreateCommand()) 
     { 
      command.CommandText = sql; 
      var reader = await command.ExecuteReaderAsync(); 
      var result = new List<T>(); 
      if (reader.HasRows) 
      { 
       await reader.ReadAsync(); 
       result = mapper.Map<DbDataReader, List<T>>(reader); 
      } 
      reader.Dispose(); 
      return result; 
     } 
    } 
} 

我應該指定更詳細的automapper配置還是不能這樣做?

回答

0

嘗試使用接口作爲IDataReaderIEnumerable而不是類DbDataReader和List。

public async Task<List<T>> Get<T>(string sql) where T : class 
{ 
    var config = new AutoMapper.MapperConfiguration(cfg => 
    { 
     cfg.CreateMap<IDataReader, IEnumerable<T>>(); 
    }); 

    var mapper = config.CreateMapper(); 
    await dbConn.OpenAsync(); 
    using (var command = dbConn.CreateCommand()) 
    { 
     command.CommandText = sql; 
     var reader = await command.ExecuteReaderAsync(); 
     var result = new List<T>(); 
     if (reader.HasRows) 
     { 
      await reader.ReadAsync(); 
      result = mapper.Map<IDataReader, IEnumerable<T>>(reader).ToList(); 
     } 
     reader.Dispose(); 
     return result; 
    } 
} 
+0

在這種情況下'mapper.Map >(reader)'returns' null' – Brivvirs