¿Cómo asignar un objeto anónimo a una clase por AutoMapper?

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 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 pregunto a la entidad como esta (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 o IEnumerable )? ¿Es posible?

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) .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) .ToList(); 

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

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

 var destination = Mapper.DynamicMap(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 MapDynamicList(IEnumerable obj) { var config = new MapperConfiguration(c => c.CreateMissingTypeMaps = true); var mapper = config.CreateMapper(); var newModel = obj.Select(mapper.Map).ToList(); return newModel; } 

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

 var viewModel = Models.Helper.MapDynamicList(model); 

donde model es el IEnumerable o Lista.