如何通过AutoMapper将匿名对象映射到类?

时间:2012-03-09 18:53:56

标签: c# mapping automapper anonymous-types

我有一个实体:

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 个答案:

答案 0 :(得分:57)

是的,有可能。您必须为您拥有的每个匿名对象使用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

现在您需要从将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();

答案 1 :(得分:2)

我不完全确定这是否可行。建议:

为什么你不能这样做:

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

答案 2 :(得分:0)

您可以使用最新的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>