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