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
我在从具有 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