Utilisation d’AutoMapper pour mapper un DataTable sur un object (DTO)

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(dataTable.Rows.OfType()); (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);