SQL Server 使用 Hierarchyid 操作层次结构数据

这篇具有很好参考价值的文章主要介绍了SQL Server 使用 Hierarchyid 操作层次结构数据。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

SQL Server 使用 Hierarchyid 操作层次结构数据 - asdyzh - 博客园

sqlserver:数据类型Hierarchyid的介绍和用法_火焰-CSDN博客

使用EF Core操作层次结构数据

以前我们存储层次结构常用Id+ParentId的方式,例如:

Id ParentId Name
1 null 总公司
2 1 分公司1
3 1 分公司2
4 2 部门A
5 4 小组X
6 4 小组Y

这种方式查询效率不高,比如查询分公司1下的所有小组,必须使用递归。

针对这个问题,如果你是使用Sql Server,可以尝试一下HierarchyId。

HierarchyId

HierarchyId是一种长度可变的Sql Server数据类型,它能存储带有层次结构的数据。

HierarchyId数据类型的值可以直接表示树层次结构中的位置,例如:

Id Name
/ 总公司
/1/ 分公司1
/2/ 分公司2
/1/1/ 部门A
/1/1/1/ 小组X
/1/1/2/ 小组Y

HierarchyId可以使用下列函数:

  • GetAncestor :取得第n个祖先

  • GetDescendant :取得第n个子节点

  • GetLevel :取得级别

  • GetRoot :取得根

  • Parse :将字符串转换为HierarchyId

  • ToString :将HierarchyId转换为字符串,与parse正好相反

比如,查询分公司1下的所有小组,可以使用下列语句:

select * from t where [Id].GetLevel() = 3 AND [Id].GetAncestor(2) = '/1/'

HierarchyId数据类型详情请参看官方文档:https://docs.microsoft.com/zh-cn/sql/relational-databases/hierarchical-data-sql-server?view=sql-server-ver15

代码示例

下面,我们通过一个示例,演示如何使用Entity Framework Core操作HierarchyId数据类型。

建表

执行下列Sql,在数据库中建表:

create table Organizations(
 Id hierarchyid primary key,
 Name nvarchar(50)
); 

创建项目

创建控制台应用程序,然后引用nuget包EntityFrameworkCore.SqlServer.HierarchyId

定义数据模型

新建Organization.cs,代码如下:

public class Organization
{
    public HierarchyId Id  { get; set; }
    public string Name { get; set; }
}

注意,Id的类型是HierarchyId。

新建DemoContext.cs,代码如下:

public class DemoContext : DbContext
{
    public DbSet<Organization> Organizations { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        string connectionString = "...";
        optionsBuilder.UseSqlServer(connectionString, config => config.UseHierarchyId());
    }
}

使用config.UseHierarchyId()开启HierarchyId映射。

增删改查

现在,我们可以对HierarchyId数据类型进行操作了。

代码如下:

//增
using (var db = new DemoContext())
{
    db.Organizations.AddRange(
            new Organization { Id= HierarchyId.Parse("/"), Name= "总公司" }
            ,new Organization { Id = HierarchyId.Parse("/1/"), Name = "分公司1" }
            ,new Organization { Id = HierarchyId.Parse("/2/"), Name = "分公司2" }
            , new Organization { Id = HierarchyId.Parse("/1/1/"), Name = "部门A" }
            , new Organization { Id = HierarchyId.Parse("/1/1/1/"), Name = "小组X" }
            , new Organization { Id = HierarchyId.Parse("/1/1/2/"), Name = "小组Y" }
        );

    db.SaveChanges();
}

//删除分公司2
using (var db = new DemoContext())
{
    db.Organizations.Remove(db.Organizations.Where(p => p.Id == HierarchyId.Parse("/2/")).First());
    db.SaveChanges();
}

//修改小组名称
using (var db = new DemoContext())
{
    var team = db.Organizations.Where(p => p.Id == HierarchyId.Parse("/1/1/1/")).First();
    team.Name = "Team1";

    team = db.Organizations.Where(p => p.Id == HierarchyId.Parse("/1/1/2/")).First();
    team.Name = "Team2";

    db.SaveChanges();
}

//查询分公司1下的所有小组
using (var db = new DemoContext())
{
    var organizations=  db.Organizations.Where(p => p.Id.GetLevel()==3 
        && p.Id.GetAncestor(2)== HierarchyId.Parse("/1/"))
        .OrderBy(p=>p.Id).ToList();
    
    foreach (var organization in organizations)
    {
        Console.WriteLine(@$"{organization.Id} {organization.Name}");
    }
}

运行成功:

SQL Server 使用 Hierarchyid 操作层次结构数据

 文章来源地址https://www.toymoban.com/news/detail-460224.html

到了这里,关于SQL Server 使用 Hierarchyid 操作层次结构数据的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 华纳云:sql server怎么导出数据库表结构

    在 SQL Server 中,您可以使用 SQL Server Management Studio (SSMS) 工具来导出数据库表结构。以下是使用 SSMS 导出数据库表结构的步骤: 1.打开 SQL Server Management Studio (SSMS): 在您的计算机上打开 SQL Server Management Studio 工具。 2.连接到数据库服务器: 使用 SSMS 连接到您想要导出表结构的

    2024年02月21日
    浏览(44)
  • 使用Django数据库模型中的ForeignKey()形成数据表记录的父子层次结构

    可以把ForeignKey()的第1个参数设置为值 “self” 实际形成数据表记录的父子层次结构。 下面是一个简单的实例: 在文件 E:Python_projectP_001myshop-testmyshopapp1models.py 中写入下面的代码: 启动数据库… 然后执行数据库迁移指令: 接下来在文件 E:Python_projectP_001myshop-testmyshop

    2024年02月16日
    浏览(70)
  • 【SQL server】数据库入门基本操作教学

    个人主页:【😊个人主页】 系列专栏:【❤️初识JAVA】 数据库是计算机系统中用于存储和管理数据的一种软件系统。它通常由一个或多个数据集合、管理系统和应用程序组成,被广泛应用于企业、政府和个人等各种领域。目前常用的数据库系统包括关系型数据库和非关系型

    2024年02月07日
    浏览(49)
  • SQL Server 清除一个数据库下所有表数据,保留表结构

    用法:在需要清空数据的数据库创建并执行存储过程,该存储过程并不会影响其他数据库 ❗请小心使用这些脚本,确保在生产环境之前备份您的数据库。⚠️ 免责声明:仅技术技术分享,谨慎操作,数据无价

    2024年02月19日
    浏览(56)
  • python连接并简单操作SQL server数据库

    环境: pycharm 、SQLserver版本2019 1.首先,在pycharm中点击File,找到setting——project:***,点击”+“,引入pymssql库 2.编写代码连接数据库,并对数据库进行查询等简单操作(此处仅展示查询)  3.在sql server中由于之前使用windows验证模式进入数据库管理器,所以要身份验证修改,

    2024年02月08日
    浏览(58)
  • .NET集成DeveloperSharp操作Sql Server数据库

    支持.Net/.Net Core/.Net Framework,可以部署在Docker, Windows, Linux, Mac。 本文提供了一种结合“原生Sql+轻量级ORM”操作各类数据库的工具。 该工具几乎只使用了一个方法/函数,却实现了几乎所有的数据操作功能。 它已成功应用到了人工智能、产业互联网、智慧医疗、等多个大型项目

    2024年03月18日
    浏览(61)
  • SQL Server 基础操作(五)导入和导出数据表

    1.选择需要导数据的数据库右击----任务----导入数据 2.选择数据源,数据源代表数据表从哪里导入到当前的数据库中。填写数据源服务器名称(本地导入:.,1433;远程导入:IP,1433) 3.选择导入的目标数据库,选择导入到那个数据库中 4.选择复制一个或多个表或视图的数据 5.选择从

    2024年02月07日
    浏览(49)
  • 【数据库数据恢复】SQL Server数据表结构损坏的数据恢复案例

    数据库故障分析: SQL server数据库数据无法读取。 经过初检,发现SQL server数据库文件无法被读取的原因是因为底层File Record被截断为0,无法找到文件开头,数据表结构损坏。镜像文件的前面几十M空间和中间一部分空间被覆盖掉,系统表损坏,无法读取。考虑用自动备份文件

    2024年02月11日
    浏览(57)
  • Python:利用pymssql模块操作SQL server数据库

    python默认的数据库是 SQLlite,不过它对MySql以及SQL server的支持也可以。这篇文章,介绍下如何在Windows下安装pymssql库并进行连接使用。。。 环境:Windows_64位 版本:python3.6 一、简单介绍 pymssql是一个python的数据库接口,基于FreeTDS构建,对_mssql模块进行了封装,遵循python的DBAP

    2024年02月12日
    浏览(52)
  • Java连接SQL Server数据库的详细操作流程

    1.1 JDK版本查看 win + r输入cmd,命令窗口输入java --version 1.2 SQL Server官网下载驱动 SQL Server驱动下载直达地址 下载完成后解压到自己熟悉的目录,不出意外的话你会看到以下文件 1.3 加载驱动类 1.4 eclipse导入驱动jar包 目录结构 右键当前工程文件,选择 build path ,然后选择 Add Exter

    2024年02月03日
    浏览(68)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包