EFCore 中的 CTE(公用表表达式)

Ham*_*eli 10 sql-server recursion hierarchy sql-cte entity-framework-core

我的数据库中有一个表,用于存储位置的层次结构。它有 3 列(Id, Name, ParentId)。我需要根据条件加载一些行以及它们的所有父行直到根。如果是在 ADO 中,我会使用以下语句。

with Temp
as
(
    select * from Locations where Name like '%filter%'

    union all

    select Locations.* 
    from Temp join Locations on Temp.ParentId = Locations.Id
)
select * from Temp
Run Code Online (Sandbox Code Playgroud)

我正在使用 EFCore,并通过一些搜索发现实体框架如何与递归层次结构一起工作?Include() 似乎不适用于它 如何使用实体框架进行递归加载?还有一堆其他的,他们都老了。

我发现的所有解决方案要么对层次结构的深度进行硬编码(使用Include),要么在 C# 中进行递归。所有这些,我的问题是最好的解决方案是什么?

我可以使用FromSqlRaw (类似下面的代码),但是我不喜欢在 C# 中手动编写查询。

    var locations = DataContext.Locations
    .FromSqlRaw("MyQuery").ToList();
Run Code Online (Sandbox Code Playgroud)

我在用EFCore 3.1.7

Jan*_*neš 8

EF Core 不支持开箱即用的 CTE,请参阅问题 #26486。但是,库linq2db 支持 CTE,并且可以连接到 EF Core