深圳建站公司好坏,自响应式网站是什么意思,德州建设街小学网站,wordpress模板开发教程前言以前我们存储层次结构常用IdParentId的方式#xff0c;例如#xff1a;IdParentIdName1null总公司21分公司131分公司242部门A54小组X64小组Y这种方式查询效率不高#xff0c;比如查询分公司1下的所有小组#xff0c;必须使用递归。针对这个问题#xff0c;如果你是使用… 前言以前我们存储层次结构常用IdParentId的方式例如IdParentIdName1null总公司21分公司131分公司242部门A54小组X64小组Y这种方式查询效率不高比如查询分公司1下的所有小组必须使用递归。针对这个问题如果你是使用Sql Server可以尝试一下HierarchyId。HierarchyIdHierarchyId是一种长度可变的Sql Server数据类型它能存储带有层次结构的数据。HierarchyId数据类型的值可以直接表示树层次结构中的位置例如IdName/总公司/1/分公司1/2/分公司2/1/1/部门A/1/1/1/小组X/1/1/2/小组YHierarchyId可以使用下列函数:GetAncestor 取得第n个祖先GetDescendant 取得第n个子节点GetLevel 取得级别GetRoot 取得根Parse 将字符串转换为HierarchyIdToString 将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?viewsql-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 DbSetOrganization 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(pp.Id).ToList();foreach (var organization in organizations){Console.WriteLine(${organization.Id} {organization.Name});}
}
运行成功如果你觉得这篇文章对你有所启发请关注我的个人公众号”My IO“记住我