使用 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
我已经为 Calculation
和 Parameter
定义了 AutoMapper 映射,但是当我投影根实体时,我只得到层次结构的第一级。
如何使 AutoMapper 自动递归投影?有没有办法做到这一点?
分层查询 可能 ProjectTo
但通常不鼓励。请记住,ProjectTo
仅创建 LINQ Select
表达式。我们无法创建无限深度的投影,因此您需要在配置地图以构建层次结构时告诉 AutoMapper MaxDepth
。
在实践中,我们做以下两件事之一:
- 为我们想要的深度明确建模层次结构级别(ParentDto、GrandParentDto)
- 使用递归 CTE 创建整个层次结构的平面列表,然后重新assemble 内存中的层次结构
后者根本不会使用 AutoMapper,但至少 SQL 不会让你的眼睛流血。
我正在尝试使用 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
我已经为 Calculation
和 Parameter
定义了 AutoMapper 映射,但是当我投影根实体时,我只得到层次结构的第一级。
如何使 AutoMapper 自动递归投影?有没有办法做到这一点?
分层查询 可能 ProjectTo
但通常不鼓励。请记住,ProjectTo
仅创建 LINQ Select
表达式。我们无法创建无限深度的投影,因此您需要在配置地图以构建层次结构时告诉 AutoMapper MaxDepth
。
在实践中,我们做以下两件事之一:
- 为我们想要的深度明确建模层次结构级别(ParentDto、GrandParentDto)
- 使用递归 CTE 创建整个层次结构的平面列表,然后重新assemble 内存中的层次结构
后者根本不会使用 AutoMapper,但至少 SQL 不会让你的眼睛流血。