使用 AutoMapper+QueryableExtensions 投影层次结构

Projecting hierarchies with AutoMapper+QueryableExtensions

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

层次结构非常简单:

我有一个计算,它有一个参数集合参数 可选地进行计算,因此递归。

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 自动递归投影?有没有办法做到这一点?

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

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

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

后者根本不会使用 AutoMapper,但至少 SQL 不会让你的眼睛流血。