0

我已经搜索了互联网来创建一个表来支持树数据或层次结构数据,但它似乎没有提供太多信息。

假设我想要一个 Location 表,如果有其他位置数据的父级,它可以自我引用。

如何在 ef-core 中实现以下查询?

  1. 列出根目录下的所有位置项(dept = 0)
  2. 列出所有位置层次结构。例如..
  • 位置 A
    • 位置 B
    • 位置 C
  • 位置 D
    • 位置 E
      • 位置 J
    • 位置 F
      • 位置 K
      • 位置 L
  • 位置 M
  1. 列出所选节点下的所有子位置并首选部门级别(例如 1、2 或其他)。
  2. 列出所选节点下的所有父位置并首选部门级别(例如 1、2 或其他)。

这是我的位置模型...

public class Location
{
    public int Id { get; set; }

    [Required]
    public string Name { get; set; }

    public string Address { get; set; }

    public NpgsqlTsVector SearchVector { get; set; }
}

请帮助或提供任何建议的资源开始会很好。我是 dotnet 核心和实体框架的新手。

谢谢你。

4

1 回答 1

0

您想要的实体似乎是这样的:

public class Location
{
    public int Id { get; set; }
    [Required]
    public string Name { get; set; }
    public string Address { get; set; }
    public NpgsqlTsVector SearchVector { get; set; }
    public int? ParentId { get; set; }
    public Location Parent { get; set; }
}

?因为你的ParentId根没有任何父母。因此,根(或可能的根)是没有任何根ParentId的,树的其他部分也可以由它们的ParentIds.

更新:

关于第二个问题,如果要读取具有层次结构的数据,还需要在实体中添加另一个属性:

public virtual List<Location> Children { get; set; }

使用以下配置:

HasMany(c => c.Children).WithOptional(c => c.Parent).HasForeignKey(c => c.ParentId);

因此,对于上述实体,只需执行 db.Location.toList(); 将获得您想要的输出。

于 2019-02-28T06:29:44.510 回答