2012-03-09 178 views
27

我有一個實體:如何通過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; } 
} 

和模型:

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

和我查詢這樣的實體(由EFNH):

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

現在,我該如何映射tagsAnon(作爲ano nymous object)集合到TagModel(例如, ICollection<TagModel>IEnumerable<TagModel>)?可能嗎?

+0

爲什麼不直接映射'Tag'到'TagModel'?爲什麼中間對象? – 2012-03-11 01:41:14

回答

2

我不完全確定這是否可能。建議:

爲什麼你就不能做到這一點:

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

這應該工作,但它失敗(我已閱讀,DynamicMap是集合玄乎

這證明。 DynamicMap可以和匿名類型一起工作,只是看起來不像枚舉類型:

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

是的,這是可能的。您必須爲每個匿名對象使用Automapper的Mapper類的DynamicMap方法。事情是這樣的:

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

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

更新DynamicMap is now obsolete

現在,你需要從設置CreateMissingTypeMapstrue配置創建一個映射:

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

從AutoMapper 4.1開始不推薦使用,現在該怎麼辦? – MobileMon 2016-05-03 12:46:25

+3

@MobileMon我已經用新的方式更新了答案。感謝您指出。 – 2016-05-11 14:28:24

+1

我可以使用「CreateMissingTypeMaps = true」確認作品。這個答案應該被標記爲有效。謝謝! – 2017-04-07 07:02:20

相關問題