【问题标题】:Create EF Core Include().ThenInclude() like function?创建 EF Core Include().ThenInclude() 之类的函数?
【发布时间】:2019-12-13 20:49:16
【问题描述】:

我正在编写一些简单的扩展方法来从域中定义的实体创建 DTO,但是,这些实体具有也是实体的属性,我希望能够编写一些东西(我个人认为优雅)就像他们在 EF Core 中使用 Include().ThenInclude() 所做的那样。

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

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

有可能吗?

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

【问题讨论】:

  • 一种方便的方法是使用 AutoMapper (ProjectTo) 来满足这种需求。
  • 你可以看看ORM模式,是关于加载相关数据here

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


【解决方案1】:

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

【讨论】:

  • 不需要Include
  • 这不是意味着我需要在存储库中实现它吗?或者我的存储库需要返回一个 IQueryable?在这两种情况下,我的存储库都不再返回域对象...?
【解决方案2】:

实际上,我通过复制 EF Core 使用大量反射和表达式树的方式,并通过创建我自己的访问者来处理整个表达式树来实现这一点。

我现在可以编写如下代码:myEntity.AsDtoable().Include( x =&gt; x.ComplexTypeProp ).ThenInclude( x =&gt; x.AnotherComplexTypeProp ).ToDto&lt; EntityDto &gt;();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-24
    • 2021-04-21
    • 2020-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-03
    相关资源
    最近更新 更多