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