Как сопоставить анонимный объект с классом AutoMapper? - PullRequest
34 голосов
/ 09 марта 2012

У меня есть сущность:

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

, и я запрашиваю сущность следующим образом (по EF или NH ):

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

Теперь, как мне сопоставить tagsAnon (как анонимный объект ) с набором TagModel (например, ICollection<TagModel> илиIEnumerable<TagModel>)?Возможно ли это?

Ответы [ 3 ]

57 голосов
/ 06 мая 2012

Да, это возможно.Вам придется использовать метод DynamicMap класса Mapper Automapper для каждого имеющегося у вас анонимного объекта.Примерно так:

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

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

Обновление : DynamicMap теперь устарел .

Теперь вам нужно создать маппер изконфигурация, которая устанавливает 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();
2 голосов
/ 09 марта 2012

Я не совсем уверен, возможно ли это. Предложения:

Почему ты не можешь просто сделать это:

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

Это СЛЕДУЕТ работать, однако это не помогает (я читал, что DynamicMap сомнителен для коллекций.

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

Это доказывает, что DynamicMap работает с анонимными типами, но не с перечисляемыми:

var destination = Mapper.DynamicMap<TagModel>(tagsAnon);
0 голосов
/ 21 мая 2018

Вы можете создать пользовательскую функцию для достижения этого с последним Automapper.Он использует свойство CreateMissingTypeMaps, как упомянуто в других ответах выше.

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

Затем вы просто вызываете функцию с помощью одной строки кода:

var viewModel = Models.Helper.MapDynamicList<MatchSubCategory>(model);

, где modelIEnumerable<object> или List<object>.

...