【问题标题】:Projecting hierarchies with AutoMapper+QueryableExtensions使用 AutoMapper+QueryableExtensions 投影层次结构
【发布时间】:2019-12-19 08:20:50
【问题描述】:

我正在尝试使用 AutoMapper 将实体层次结构投影到某些 DTO。我正在使用 EntityFramework Core(迄今为止的最新稳定版本)。

层次结构真的很简单:

我有一个 Calculation,其中包含 参数集合参数可选地有一个计算,因此是递归的。

class Calculation 
{
   int Id {get; set; }
   ICollection<Parameter> Parameters { get; set }
}

class Parameter
{
   int Id {get; set; }
   Calculation Calculation { get; set }
}

我想把它投影到一棵树上

Calc1
    Param1
    Param2
    Param3
       Calc2
          Param4
          Param4

我已经为 CalculationParameter 定义了 AutoMapper 映射,但是当我投影根实体时,我只能得到层次结构的第一级。

如何使 AutoMapper 自动进行递归投影?有没有办法做到这一点?

【问题讨论】:

  • 如果这是一个 EF 模型calc.Parameters().First().Calculation == calc 将永远是真的。
  • 我已经配置 EF 来避免这种情况 :) 我有父计算和子计算

标签: entity-framework entity-framework-core automapper iqueryable


【解决方案1】:

分层查询可能使用ProjectTo,但通常不鼓励。请记住,ProjectTo 只创建一个 LINQ Select 表达式。我们无法创建无限深度的投影,因此在配置地图以构建层次结构时,您需要告诉 AutoMapper MaxDepth

在实践中,我们会做以下两件事之一:

  • 为我们想要的深度显式建模层次结构级别(ParentDto、GrandParentDto)
  • 使用递归 CTE 创建整个层次结构的平面列表,然后在内存中重新组装层次结构

后者根本不会使用 AutoMapper,但至少会产生不会让你眼花缭乱的 SQL。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-18
    • 2016-09-22
    • 1970-01-01
    • 2019-04-29
    相关资源
    最近更新 更多