2012-03-09 39 views
27

Tôi có một thực thể:cách ánh xạ một đối tượng ẩn danh tới một lớp bằng 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; } 
} 

và một mô hình:

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

và tôi truy vấn các tổ chức như thế này (bằng cách EF hoặc NH):

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

Bây giờ, làm cách nào tôi có thể lập bản đồ số tagsAnon (dưới dạng anbom ano) đối tượng nymous) thành bộ sưu tập gồm TagModel (ví dụ: ICollection<TagModel> hoặc IEnumerable<TagModel>)? Có thể không?

+0

Tại sao không lập bản đồ 'Tag' trực tiếp cho 'TagModel'? Tại sao là đối tượng trung gian? –

Trả lời

2

Tôi không hoàn toàn chắc chắn nếu điều này là có thể. Gợi ý:

Tại sao không thể bạn chỉ làm điều này:

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

này NÊN làm việc, tuy nhiên nó không thành công (Tôi đã đọc rằng DynamicMap là iffy vào bộ sưu tập

Điều này chứng tỏ rằng. DynamicMap không hoạt động với các loại anon, dường như không có số đếm:

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

Có, có thể. Bạn sẽ phải sử dụng phương thức DynamicMap của lớp Mapper của Automapper cho mỗi đối tượng ẩn danh mà bạn có. Một cái gì đó như thế này:

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

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

Cập nhật: DynamicMap is now obsolete.

Bây giờ bạn cần để tạo ra một ánh xạ từ một cấu hình mà bộ CreateMissingTypeMaps để 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

Điều này sẽ không còn được sử dụng như AutoMapper 4.1, bạn phải làm gì bây giờ? – MobileMon

+3

@MobileMon Tôi đã cập nhật câu trả lời bằng cách làm mới. Cảm ơn đã chỉ ra điều đó. –

+1

Tôi có thể xác nhận bằng cách sử dụng "CreateMissingTypeMaps = true" hoạt động. Câu trả lời này phải được đánh dấu là hợp lệ. Cảm ơn! –

Các vấn đề liên quan