使用 AutoMapper+QueryableExtensions 投影层次结构



我正在尝试使用自动映射器将实体层次结构投影到某些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定义了自动映射器映射,但是当我投影根实体时,我只获得了层次结构的第一级。

如何使自动映射器自动递归投影?有没有办法做到这一点?

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

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

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

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

最新更新