2012-03-09 47 views
27

tengo una entidad:cómo asignar un objeto anónimo a una clase mediante AutoMapper?

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 consultar la entidad como esto (por EF o NH):

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

Ahora, ¿cómo puedo mapear el tagsAnon (como un año objeto nimo) a una colección de TagModel (p. ICollection<TagModel> o IEnumerable<TagModel>)? ¿Es posible?

+0

¿Por qué no se asignan directamente a '' tag' TagModel'? ¿Por qué el objeto intermedio? –

Respuesta

2

no estoy del todo seguro de si esto es posible. Sugerencias:

por qué no puedes simplemente hacer esto:

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

esto debería funcionar, sin embargo, no (he leído que DynamicMap es dudoso en colecciones

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

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

Sí, es posible. Debería usar el método DynamicMap de la clase Automapper's Mapper 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 is now obsolete.

Ahora tiene que crear un asignador de una configuración que establece CreateMissingTypeMaps a 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(); 
+0

Esto está obsoleto a partir de AutoMapper 4.1, ¿qué hacer ahora? – MobileMon

+3

@MobileMon He actualizado la respuesta con la nueva forma de hacerlo. Gracias por mencionarlo. –

+1

Puedo confirmar que el uso de "CreateMissingTypeMaps = true" funciona. Esta respuesta debe marcarse como válida. ¡Gracias! –

Cuestiones relacionadas