编辑
2025-09-22
C#
00

目录

实体类定义
测试数据
树型递归查询
步骤 1:查询所有组织
步骤 2:构建树形结构
查找所有下级
查找所有上级
总结

在开发复杂的业务系统时,经常会遇到需要处理具有层级结构的数据,例如组织架构、产品分类等。这时,树型递归查询就显得尤为重要。SqlSugar 作为一个轻量级而又功能强大的 ORM 框架,为我们处理这类问题提供了便利。本文将详细介绍如何在 SqlSugar 中实现树型递归查询,并通过具体的例子来加深理解。

实体类定义

首先,我们定义一个简单的实体类来表示具有层级结构的数据。以下是一个表示组织结构的实体类 Organization 的定义:

C#
public class Organization { public int Id { get; set; } public string Name { get; set; } public int ParentId { get; set; } public List<Organization> Children { get; set; } }

在这个实体类中,Id 表示组织的唯一标识,Name 表示组织的名称,ParentId 表示上级组织的 IdChildren 用于存储子组织的列表。

测试数据

image.png

树型递归查询

接下来,我们将展示如何使用 SqlSugar 来实现树型递归查询。我们的目标是从数据库中查询出所有组织,并构建成树形结构。

步骤 1:查询所有组织

首先,我们需要从数据库中查询出所有的组织记录。SqlSugar 提供了非常简洁的 API 来完成这一操作:

C#
SqlSugarRepository<Organization> _repOrganization = new SqlSugarRepository<Organization>(); List<Organization> allOrganizations = _repOrganization.AsQueryable().ToList();

步骤 2:构建树形结构

接下来,我们需要将查询出的所有组织记录构建成树形结构。这里我们定义一个递归方法来实现这一功能:

C#
static void Main() { // 实例化 SqlSugarRepository SqlSugarRepository<Organization> _repOrganization = new SqlSugarRepository<Organization>(); // 从数据库获取组织数据,并构建成树型结构 // 注意:假设顶级节点的 ParentId 为 1 var ret = _repOrganization.AsQueryable().ToTree(x => x.Children, x => x.ParentId, 0, x => x.Id); // 递归打印树型结构 foreach (var item in ret) { PrintTree(item, ""); } } // 递归函数:以树型样式打印组织名称 // item: 当前要打印的节点 // indent: 缩进,用于显示树型结构的层次 static void PrintTree(Organization item, string indent) { Console.WriteLine($"{indent}{item.Name}"); if (item.Children != null) { foreach (var child in item.Children) { // 对于每个子节点,增加缩进,并递归打印 PrintTree(child, indent + " "); } } }

image.png

查找所有下级

C#
var ret = _repOrganization.AsQueryable() .ToChildList(x => x.ParentId,2);

用于根据指定的条件从一组数据中构建子列表。这里的条件是 ParentId,而 2 假设是你想要获取其子组织的父组织的ID。

查找所有上级

C#
var ret = _repOrganization.AsQueryable() .ToParentList(x => x.ParentId,2);

获取ID为2的组织的所有父级组织的。

总结

通过本文的介绍,我们了解了如何在 SqlSugar 中实现树型递归查询。通过定义实体类、查询所有记录、以及使用递归方法构建树形结构,我们可以有效地处理和展示层级数据。SqlSugar 以其简洁的 API 和强大的功能,为我们处理复杂的数据结构提供了极大的便利。希望本文能帮助你更好地理解和使用 SqlSugar 来处理树型数据。

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!