【发布时间】:2020-12-25 15:38:31
【问题描述】:
我的数据库中有一个存储位置层次结构的表。它有 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 it 、How to do recursive load with Entity framework? 和其他一堆旧的。
我发现的所有解决方案要么对层次结构的深度进行硬编码(使用Include),要么在 C# 中进行递归。综上所述,我的问题是这样做的最佳解决方案是什么?
我可以使用FromSqlRaw (类似于以下代码)但是我不喜欢在 C# 中手动编写查询。
var locations = DataContext.Locations
.FromSqlRaw("MyQuery").ToList();
我正在使用EFCore 3.1.7
【问题讨论】:
-
对于 Oracle,您首先拥有深度优先/广度 - 不确定 SQL Server 是否也如此。所以也许这会有所帮助:stackoverflow.com/questions/11636420/a-real-recursion-with-cte/…
-
感谢您的评论 @JGFMK 但此链接是 SQL 的答案,而不是 EFCore。我已经在我的问题中提供了它。
-
如果您不喜欢嵌入原始查询文本,您可以随时编写视图、存储过程或表值函数来返回数据并访问它们。我对 EF Core 没有直接经验,但如果它支持递归查询,我会感到惊讶。
-
感谢@JeroenMostert,由于我首先使用代码,因此我应该编写原始查询来创建 SP 或视图。所以,这不是我想要的。
标签: sql-server recursion entity-framework-core hierarchy sql-cte