tutorial mvc initialize inicializar example ejemplos createmap c# mapping automapper anonymous-types

c# - mvc - cómo asignar un objeto anónimo a una clase mediante AutoMapper?



mapper initialize (3)

Tengo una entidad:

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

y un modelo:

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

y consulto la entidad de esta manera (por EF o NH ):

var tagsAnon = _context.Tags .Select(t => new { Tag = t, PostsCount = t. Posts.Count() }) .ToList();

Ahora, ¿cómo puedo asignar las tagsAnon (como un objeto anónimo ) a una colección de TagModel (por ejemplo, ICollection<TagModel> o IEnumerable<TagModel> )? ¿Es posible?


No estoy completamente seguro de si esto es posible. Sugerencias:

¿Por qué no puedes hacer esto?

var tagsAnon = _context.Tags .Select(t => new TagModel { Tag = t, PostsCount = t. Posts.Count() }) .ToList();

Esto DEBERÍA funcionar, sin embargo falla (he leído que DynamicMap es dudoso en las colecciones).

var destination = Mapper.DynamicMap<IEnumerable<TagModel>>(tagsAnon);

Esto demuestra que DynamicMap funciona con tipos anon, simplemente no aparentemente con enumerables:

var destination = Mapper.DynamicMap<TagModel>(tagsAnon);


Puede crear una función personalizada para lograr esto con el último Automapper. Utiliza la propiedad CreateMissingTypeMaps como se menciona en otras respuestas anteriores.

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

Entonces simplemente llama a la función con esta única línea de código:

var viewModel = Models.Helper.MapDynamicList<MatchSubCategory>(model);

donde model es el IEnumerable o Lista.


Sí, es posible. Tendría que usar el método DynamicMap de la clase Mapper de Automapper para cada objeto anónimo que tenga. Algo como esto:

var tagsAnon = Tags .Select(t => new { t.Id, t.Word, PostsCount = t.Posts.Count() }) .ToList(); var tagsModel = tagsAnon.Select(Mapper.DynamicMap<TagModel>) .ToList();

Actualización : DynamicMap ahora está obsoleto .

Ahora necesita crear un asignador desde una configuración que establezca CreateMissingTypeMaps en 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();