4

我的数据库中有一个存储位置层次结构的表。它有 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,并通过一些搜索发现了实体框架如何与递归层次结构一起使用?Include() 似乎无法使用它 如何使用实体框架进行递归加载?还有一堆其他的,他们都老了。

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

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

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

我在用EFCore 3.1.7

4

1 回答 1

0

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

于 2022-01-22T11:11:29.930 回答