创建EF Core Include()。ThenInclude()之类的函数吗?

时间:2019-10-05 13:48:45

标签: c# .net-core entity-framework-core

我正在编写一些简单的扩展方法,以根据域中定义的实体创建DTO,但是这些实体具有的属性也是实体,我希望能够编写一些东西(我个人发现优雅),就像在EF Core中使用Include()。ThenInclude()一样。

理想情况下,我希望能够写类似的东西

return myEntity.ToDto().Include(entity => entity.SubEntity).ThenInclude(subEntity => subEntity.AnotherSubEntity);

有可能吗?

这个想法是,如果我只调用ToDto(),我将只收到一个基本的DTO对象,该对象中设置了所有简单类型属性,而所有复杂类型属性都设置为null,除非我指定我要也包括其中一个(或多个)属性。

2 个答案:

答案 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 >();

的代码