【问题标题】:EF Core self joined ICollection queryEF Core 自联接 ICollection 查询
【发布时间】:2021-10-22 16:52:12
【问题描述】:

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

这是我的表结构:

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 表中有一个自引用关系,它是一对多。 SoqHeading 表可以有零个或多个SoqItems

我的数据库中的数据是这样的

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

喜欢这个

 {
    "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();

请帮忙

【问题讨论】:

  • JSON 表示不是显示您想要的内容的最佳方式,但我认为 this 是您的问题。
  • 能否请您清除您的 jsons 并仅保留重要属性。很难弄清楚你拥有什么和想要什么。
  • @GertArnold,感谢您的尝试,但这不是我的问题
  • @Serge,我已经更新了这个问题。请检查并让我知道现在是否清楚
  • 那么你需要某种递归查询。类似的问题还有很多,找LINQ+recursive 或者hierarchy吧。

标签: sql-server entity-framework-core linq-to-sql linq-to-entities ef-core-5.0


【解决方案1】:

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

所以这里的工作是这样的https://khalidabuhakmeh.com/recursive-data-with-entity-framework-core-and-sql-server

【讨论】:

    猜你喜欢
    • 2018-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-29
    • 2020-04-29
    • 2019-03-27
    • 1970-01-01
    相关资源
    最近更新 更多