EF Core 自加入 ICollection 查询

EF Core self joined ICollection query

我在从具有 ICollection 的自引用数据table 中查询数据时遇到问题。

这是我的 table 结构:

public class SoqHeading 
{
        public int Id { get; set; }
        
        public string ItemNo { get; set; } 
        public string Heading { get; set; }
        
        public SoqRevision SoqRevision_NP { get; set; }

        public ICollection<SoqItem> Items { get; set; }

        public int? ParentSoqHeadingId { get; set; }
        public SoqHeading Parent_NP { get; set; }

        public ICollection<SoqHeading> Children_NP { get; set; }
}

public class SoqItem 
{
    public int Id { get; set; }
    public SoqPreliminaryOrContract_enum PreliminaryOrContract { get; set; }
    
     
    public int SoqHeadingId { get; set; }
    
    public SoqHeading SoqHeading_NP { get; set; }
}

我在 SoqHeading table 中有一个自引用关系,它是一对多。 SoqHeading table 可以有零个或多个 SoqItems.

这是我数据库中的数据

我想要的是从 SoqHeading table 的根节点及其子节点和项目中查询所有内容。

像这样

 {
    "ItemNo": "C",
    "Items": [
      {
        "ItemNo": "c-1",
      },
      {
        "ItemNo": "c-2",
      }
    ],
    "Children_NP": [
      {
        "ItemNo": "C.1",
        "Children_NP": [
          {
            "ItemNo": "C.1.1",
            "Items": [
              {
                "ItemNo": "c.1.1-1",
              },
              {
                "ItemNo": "c.1.1-2",
              }
            ],
            "Children_NP": [],
          },
          {
            "ItemNo": "C.1.2",
            "Items": [
              {
                "ItemNo": "c.1.2-1",
              },
              {
                "ItemNo": "c.1.2-2",
              }
            ],
            "Children_NP": [],
          }
        ],
      },
      {
        "ItemNo": "C.2",
        "Children_NP": [],
      }
    ]
  }

但目前我从这样的查询中获取数据

[
  {
    "ItemNo": "C"
  },
  {
    "ItemNo": "C.1.2",
  }
]

其中 C.1.2 必须在 C 中,但事实并非如此。 C 和 C.1.2 处于同一级别,我不会通过以下查询生成该级别

var entity = await _context.SoqHeadings
                            .Include(i=>i.Items)
                            .Include(i => i.Children_NP)
                            .Where(w => w.SoqRevision_NP.ProjectId == 10)
                            .ToListAsync();

请帮忙

所以 EFcore 似乎不支持将子节点包含在第一个子节点上 https://github.com/dotnet/efcore/issues/14144

所以这里的解决方法是这样的https://khalidabuhakmeh.com/recursive-data-with-entity-framework-core-and-sql-server