解释为什么这个问题不同于:EF - multiple includes to eager load hierarchical data. Bad practice?
在当前项目(.NET核心web api)中,我尝试从自引用表中加载层次结构。
经过谷歌搜索后,我很惊讶这样的任务(我认为这是微不足道的)似乎并不是微不足道的。
好吧,我有这个表来形成我的层次结构:
CREATE TABLE [dbo].[Hierarchy] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[Parent_Id] INT NULL,
[Name] NVARCHAR (50) NOT NULL,
PRIMARY KEY CLUSTERED ([Id] ASC),
CONSTRAINT [FK_Hierarchy_Hierarchy] FOREIGN KEY ([Parent_Id]) REFERENCES [dbo].[Hierarchy] ([Id])
);
在web api中,我尝试返回完整的层次结构。一个可能特别的事情(可能会有所帮助)就是我要加载完整的表格。
我也知道我可以使用预先加载和导航属性(子项为Parent和InverseParent)
_dbContext.Hierarchy.Include(h => h.InverseParent).ThenInclude(h => h.InverseParent)...
问题在于这会加载硬编码深度(例如,如果我使用1 Include()和5 ThenInclude(),则会加载六个级别),但我的层次结构具有灵活的深度。
任何人都可以通过向我提供一些代码来帮助我,如何加载整个表格(例如,在1个数据库调用的最佳方案中进入内存),然后让方法返回完整的层次结构?
答案 0 :(得分:18)
事实上,由于所谓的EF(核心)关系修复,加载整个层次结构非常容易。
假设我们有以下型号:
public class Hierarchy
{
public int Id { get; set; }
public string Name { get; set; }
public Hierarchy Parent { get; set; }
public ICollection<Hierarchy> Children { get; set; }
}
然后是以下代码
var hierarchy = db.Hierarchy.Include(e => e.Children).ToList();
将使用正确填充的Parent
和Children
属性加载整个层次结构。
当您需要加载层次结构的一部分时,引用的帖子中描述的问题就出现了,由于LINQ中缺少CTE支持而这很难。
答案 1 :(得分:1)
我已经构建了存储过程来使用递归cte获取所有级别的所有子级 stored procedure to get all childs ids of any level of self-referencing table using Entity Framework and recursive cte