comment mapper un objet anonyme à une classe par AutoMapper?
j'ai une entité:
public class Tag {
public int Id { get; set; }
public string Word { get; set; }
// other properties...
// and a collection of blogposts:
public ICollection<Post> Posts { get; set; }
}
et un modèle:
public class TagModel {
public int Id { get; set; }
public string Word { get; set; }
// other properties...
// and a collection of blogposts:
public int PostsCount { get; set; }
}
et j'ai une requête de l'entité comme ceci (par EF ou NH):
var tagsAnon = _context.Tags
.Select(t => new { Tag = t, PostsCount = t. Posts.Count() })
.ToList();
maintenant, comment puis-je cartographier le tagsAnon
(objet anonyme) à une collection de TagModel
(e.g. ICollection<TagModel>
ou IEnumerable<TagModel>
)? Est-il possible?
3 réponses
Oui, c'est possible. Vous devez utiliser la méthode DynamicMap de la classe mapper de L'Automapper pour chaque objet anonyme que vous avez. Quelque chose comme ceci:
var tagsAnon = Tags
.Select(t => new { t.Id, t.Word, PostsCount = t.Posts.Count() })
.ToList();
var tagsModel = tagsAnon.Select(Mapper.DynamicMap<TagModel>)
.ToList();
mise à Jour:DynamicMap est désormais obsolète.
Maintenant vous devez créer un mapper à partir d'une configuration qui définit CreateMissingTypeMaps
true
:
var tagsAnon = Tags
.Select(t => new { t.Id, t.Word, PostsCount = t.Posts.Count })
.ToList();
var config = new MapperConfiguration(cfg => cfg.CreateMissingTypeMaps = true);
var mapper = config.CreateMapper();
var tagsModel = tagsAnon.Select(mapper.Map<TagModel>)
.ToList();
Je ne suis pas entièrement sûr que ce soit possible. Suggestions:
Pourquoi tu ne peux pas faire ceci:
var tagsAnon = _context.Tags
.Select(t => new TagModel { Tag = t, PostsCount = t. Posts.Count() })
.ToList();
cela devrait fonctionner, mais il échoue (J'ai lu que DynamicMap est iffy sur les collections.
var destination = Mapper.DynamicMap<IEnumerable<TagModel>>(tagsAnon);
cela prouve que DynamicMap fonctionne avec les types anon, mais pas apparemment avec les énumérables:
var destination = Mapper.DynamicMap<TagModel>(tagsAnon);
Vous pouvez créer une fonction personnalisée pour atteindre cette dernière Automapper. Il utilise la propriété CreateMissingTypeMaps comme indiqué dans les autres réponses ci-dessus.
public static List<T> MapDynamicList<T>(IEnumerable<object> obj)
{
var config = new MapperConfiguration(c => c.CreateMissingTypeMaps = true);
var mapper = config.CreateMapper();
var newModel = obj.Select(mapper.Map<T>).ToList();
return newModel;
}
alors vous appelez simplement la fonction avec cette seule ligne de code:
var viewModel = Models.Helper.MapDynamicList<MatchSubCategory>(model);
où model
est l'interface IEnumerable ou de la Liste.