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?

30
demandé sur king.net 2012-03-09 22:53:55

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 CreateMissingTypeMapstrue:

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();
54
répondu Caio Proiete 2016-05-11 14:27:37

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);
2
répondu Justin Pihony 2012-03-09 19:35:30

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);

model est l'interface IEnumerable ou de la Liste.

0
répondu vohrahul 2018-05-20 21:13:32