使用EntityFramework.Core從自引用表加載完整層次結構

asp.net-core c# entity-framework-core linq

解釋為什麼這個問題不同於: EF - 多個包括急切加載分層數據。不好的做法?

  1. 可能的重複是基於意見的問題,如果這是一個不好的做法,而我的問題往往得到如何做的技術解決方案,獨立於意見,如果這是一個好的做法。我將此決定留給產品所有者,需求工程師,項目經理和想要該功能的客戶。
  2. 給出的答案要么解釋為什麼這是一個不好的做法,要么使用一種對我不起作用的方法(使用Include()和ThenInclude()產生硬編碼深度,而我需要靈活的深度)。

在當前項目(.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 DB調用的最佳方案中進入內存),然後讓方法返回完整的層次結構?

一般承認的答案

事實上,由於所謂的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();

將使用正確填充的ParentChildren屬性加載整個層次結構。

當您需要加載層次結構的一部分時,引用的帖子中描述的問題就出現了,由於LINQ中缺少類似CTE的支持,這很難實現。




Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因