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

我的数据库中有一个存储位置层次结构的表。它有 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

我正在使用 EFCore,经过几次搜索,我发现了 How does Entity Framework work with recursive hierarchies? Include() seems not to work with itHow to do recursive load with Entity framework? 和一堆其他的,它们都是旧的。

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

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

    var locations = DataContext.Locations
    .FromSqlRaw("MyQuery").ToList();

我正在使用 EFCore 3.1.7

stack overflow CTE (Common Table Expression) in EFCore
原文答案

答案:

作者头像

开箱即用的 EF Core 不支持 CTE,请参阅 issue #26486 。但是,库 linq2db supports CTE 和它 can be connected to EF Core