使用AutoMapper将DataTable映射到对象(DTO)

时间:2016-02-15 16:23:06

标签: c# automapper

我正在尝试使用AutoMappers DynamicMap功能将DataTable映射到对象(DTO)。

DataTable dt;
dt = new dalAllInvestors().InvestorNameSearch(investorNameSearch);

// Look at DynamicMap - Urgent 
List<dtoAPISimpleInvestor> apiObject = AutoMapper.Mapper.DynamicMap<IDataReader, List<dtoAPISimpleInvestor>>(
dt.CreateDataReader());

return apiObject;


public class dtoAPISimpleInvestor
{
    public int FirmID { get; set; }
    public string FirmName { get; set; }
    public string Type { get; set; }
    public string Location { get; set; }
}

dt返回10行但是当你看到apiObject时它没有返回任何行,这似乎没有任何意义。我现在已经看了一段时间,谷歌搜索后看起来我正在做的正确。

正确的列在其返回时位于dt中,映射到dtoAPISimpleInvestor

有人可以帮帮我吗?

3 个答案:

答案 0 :(得分:16)

如下所示......

AutoMapper个人资料

public sealed class SimpleInvestorProfile : Profile
{
  // This is the approach starting with version 5
  public SimpleInvestorProfile()
  {
      IMappingExpression<DataRow, dtoAPISimpleInvestor> mappingExpression;

    mappingExpression = CreateMap<DataRow, dtoAPISimpleInvestor>();
    mappingExpression.ForMember(d => d.FirmID, o => o.MapFrom(s => s["FirmID"]));
    mappingExpression.ForMember(d => d.FirmName, o => o.MapFrom(s => s["FirmName"]));
    mappingExpression.ForMember(d => d.Type, o => o.MapFrom(s => s["Type"]));
    mappingExpression.ForMember(d => d.Location, o => o.MapFrom(s => s["Location"]));

  }

  // this method is obsolete in version 5
  // protected override void Configure()
  // {
  //   IMappingExpression<DataRow, dtoAPISimpleInvestor> mappingExpression;

  //  mappingExpression = CreateMap<DataRow, dtoAPISimpleInvestor>();
  //  mappingExpression.ForMember(d => d.FirmID, o => o.MapFrom(s => s["FirmID"]));
  //  mappingExpression.ForMember(d => d.FirmName, o => o.MapFrom(s => s["FirmName"]));
  //   mappingExpression.ForMember(d => d.Type, o => o.MapFrom(s => s["Type"]));
  //  mappingExpression.ForMember(d => d.Location, o => o.MapFrom(s => s["Location"]));

  //  return;
 // }
}

注意:我使用DataRow类型作为来源,而不是IDataReader(详见下文)。

使用个人资料

MapperConfiguration configuration;

configuration = new MapperConfiguration(a => {a.AddProfile(new SimpleInvestorProfile());});

IMapper mapper;

mapper = configuration.CreateMapper();

List<dtoAPISimpleInvestor> result;

result = mapper.Map<List<DataRow>, List<dtoAPISimpleInvestor>>(rows);

result对象应包含正确数量的dtoAPISimpleInvestor个具有正确数据的对象。

注意:对mapper.Map的调用采用List<DataRow>类型的对象,可以使用语句DataTablenew List<DataRow>(dataTable.Rows.OfType<DataRow>());对象获取该对象(因为Rows对象的DataTable属性是一个实现IEnumerable但不是IEnumerable<T>的集合。)

这可能不是唯一的解决方案,但我已经验证它有效。

作为旁注,我注意到您引用的DynamicMap方法已在最新版本的库中标记为已过时,因此您可能希望避免使用它。

答案 1 :(得分:0)

这对我有用: automapper的版本是从掘金下载3.1.1

using AutoMapper;

public List<T> ReadData<T>(DataTable dt)
{            
  return Mapper.DynamicMap<IDataReader, List<T>>(dt.CreateDataReader());                        
}

像这样的调用方法:

DataTable dt = getPeopleDT();
List<PEOPLEDTO> peopleList = ReadData<PEOPLEDTO>(dt);   

答案 2 :(得分:0)

如上所述 new List(dataTable.Rows.OfType()) 将起作用, 但是如果您正在使用 aspcore 应用程序,由于 DI,您可能对使用 new 关键字不感兴趣,因此您可以使用 (datatable.Rows.OfType(DataRow)).ToList()