我有一个实体:
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>
)?有可能吗?
答案 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);
其中model
是IEnumerable<object>
或List<object>
。