我在数据库中有一张存储位置层级结构的表格。它有三列(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