我正在编写一些简单的扩展方法,以根据域中定义的实体创建DTO,但是这些实体具有的属性也是实体,我希望能够编写一些东西(我个人发现优雅),就像在EF Core中使用Include()。ThenInclude()一样。
理想情况下,我希望能够写类似的东西
return myEntity.ToDto().Include(entity => entity.SubEntity).ThenInclude(subEntity => subEntity.AnotherSubEntity);
有可能吗?
这个想法是,如果我只调用ToDto()
,我将只收到一个基本的DTO对象,该对象中设置了所有简单类型属性,而所有复杂类型属性都设置为null
,除非我指定我要也包括其中一个(或多个)属性。
答案 0 :(得分:0)
AutoMapper Queryable Extensions提供了一种方便的方法来查询具有关联关系的实体并将它们映射到DTO,只需一步即可。 它会生成复制该数据所需的优化SQL查询。
示例:
var config = new MapperConfiguration(cfg => {
cfg.CreateMap<BlogDTO, Blog>().ReverseMap();
cfg.CreateMap<PostDTO, Post>().ReverseMap();
});
return _context.Blogs.Where(b => b.Id == Id)
.Include(x => x.Posts)
.ProjectTo<BlogDTO>(config)
.ToList();
答案 1 :(得分:0)
通过复制EF Core如何使用大量反射树和表达式树,并创建自己的访问者来处理整个表达式树,我实际上已经做到了。
我现在能够编写类似myEntity.AsDtoable().Include( x => x.ComplexTypeProp ).ThenInclude( x => x.AnotherComplexTypeProp ).ToDto< EntityDto >();