我正在尝试使用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
有人可以帮帮我吗?
答案 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>
类型的对象,可以使用语句DataTable
从new 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()