2012-03-09 12 views
27

mam jednostki:jak odwzorować anonimowy obiekt na klasę przez AutoMappera?

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

i model:

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

i zapytań jednostce tak (przez EF lub NH):

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

Teraz, jak mogę mapować tagsAnon (jako ano nymous object) do kolekcji TagModel (np. ICollection<TagModel> lub IEnumerable<TagModel>)? Czy to możliwe?

+0

Dlaczego nie map 'Tag' bezpośrednio do' TagModel'? Dlaczego obiekt pośredni? –

Odpowiedz

2

Nie jestem do końca pewien, czy jest to możliwe. Sugestie:

Dlaczego nie można po prostu to zrobić:

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

To powinno działać, jednak nie (Czytałem, że DynamicMap jest niepewna na zbiorach

Dowodzi to, że. DynamicMap działa z typami anon, po prostu pozornie z przelicznikami:

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

Tak, jest to możliwe. Będziesz musiał użyć metody DynamicMap klasy Mapper Automappera dla każdego anonimowego obiektu, który posiadasz. Coś takiego:

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

var tagsModel = tagsAnon.Select(Mapper.DynamicMap<TagModel>) 
    .ToList(); 

Aktualizacja: DynamicMap is now obsolete.

Teraz trzeba utworzyć mapowania od konfiguracji, który ustawia CreateMissingTypeMaps do 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

Jest to przestarzałe od wersji AutoMapper 4.1, co teraz zrobić? – MobileMon

+3

@MobileMon Zaktualizowałem odpowiedź w nowy sposób. Dziękuję za wskazanie. –

+1

Potwierdzam, że działa "CreateMissingTypeMaps = true". Ta odpowiedź powinna być oznaczona jako poprawna. Dzięki! –

Powiązane problemy