【问题标题】:CTE (Common Table Expression) in EFCoreEFCore 中的 CTE(公用表表达式)
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-12
    相关资源
    最近更新 更多