IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> SQL Server 使用 Hierarchyid 操作层次结构数据 -> 正文阅读

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

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

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

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

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

IdParentIdName
1null总公司
21分公司1
31分公司2
42部门A
54小组X
64小组Y

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

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

HierarchyId

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

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

IdName
/总公司
/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}");
????}
}

运行成功:

图片

?

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-11-24 08:01:04  更:2021-11-24 08:01:15 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 8:44:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码