J’essaie de mapper un DataTable sur un object (DTO) à l’aide de la fonctionnalité AutoMappers DynamicMap.
DataTable dt; dt = new dalAllInvestors().InvestorNameSearch(investorNameSearch); // Look at DynamicMap - Urgent List apiObject = AutoMapper.Mapper.DynamicMap<IDataReader, List>( dt.CreateDataReader()); return apiObject; public class dtoAPISimpleInvestor { public int FirmID { get; set; } public ssortingng FirmName { get; set; } public ssortingng Type { get; set; } public ssortingng Location { get; set; } }
dt
renvoie 10 lignes, mais lorsque vous regardez l’apiObject, il ne renvoie aucune ligne et cela ne semble avoir aucun sens. Cela fait un moment que je suis en train de regarder cela et après avoir googlé, il semble que je le fasse correctement.
Les colonnes correctes sont dans le dt lors de son retour, qui mappe vers le dtoAPISimpleInvestor
Quelqu’un peut-il m’aider s’il vous plaît?
Que diriez-vous de quelque chose comme ce qui suit …
Profil AutoMapper
public sealed class SimpleInvestorProfile : Profile { // This is the approach starting with version 5 public SimpleInvestorProfile() { IMappingExpression mappingExpression; mappingExpression = CreateMap(); 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 mappingExpression; // mappingExpression = CreateMap(); // 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; // } }
REMARQUE : J’utilise le type DataRow
comme source et non pas IDataReader
(plus d’informations à ce sujet ci-dessous).
Utiliser le profil
MapperConfiguration configuration; configuration = new MapperConfiguration(a => {a.AddProfile(new SimpleInvestorProfile());}); IMapper mapper; mapper = configuration.CreateMapper(); List result; result = mapper.Map, List>(rows);
L’object de result
doit contenir le nombre correct d’objects dtoAPISimpleInvestor
avec les données correctes.
Remarque : l’appel à mapper.Map
prend un object de type List
qui peut être obtenu à partir de l’object DataTable
à l’aide de l’instruction new List
(puisque la propriété Rows
de l’object DataTable
est une collection qui implémente IEnumerable
mais pas IEnumerable
).
Ce n’est probablement pas la seule solution mais j’ai validé que cela fonctionne.
En remarque, j’ai remarqué que la méthode DynamicMap
que vous avez référencée a été marquée comme obsolète dans la dernière version de la bibliothèque. Vous voudrez peut-être éviter de l’utiliser.
Cela a fonctionné pour moi: la version de automapper est 3.1.1 télécharger à partir de nugget
using AutoMapper; public List ReadData (DataTable dt) { return Mapper.DynamicMap>(dt.CreateDataReader()); }
Méthode d’appel comme ceci:
DataTable dt = getPeopleDT(); List peopleList = ReadData (dt);