十年河东,十年河西,莫欺少年穷。

学无止境,精益求精

难得有清闲的一上午,索性写篇博客。

首先,我们需要准备一张表,如下范例:

create table TreeTable
(
TreeId varchar(100) not null primary key,
NodeName nvarchar(50),--名称
FatherTreeId varchar(100),--父亲Id
)

为了节约时间,我直接沿用项目中的数据,作如下批量插入:

insert into TreeTable(TreeId,NodeName,FatherTreeId)
select [SpClassifyId],[ClassifyName],[ParentClassifyId]
from [dbo].[SM_SupplierClassify] 
where [ForefatherClassifyName] in('工程类','精装修类','设计类','营销类')

插入的数据,如下所示:

C# 递归构造树状数据结构(泛型),如何构造?如何查询?

从上图,我们可以看出,这些数据中有四种大类,分别为:('工程类','精装修类','设计类','营销类'),层级关系通过FatherTreeId构造,当然,此表中的层次不仅仅只有两级,理论上支持N级,类似这种结构的数据现实生活中有很多,如:家谱,人员组织架构,营销模式(微信的吸粉,病毒式营销),甚至传销模式等等

那么,我们如何将上述数据转变为树状结构的数据类型呢?

大家都会想到递归,但如何递归呢?

两种方法,

一、如何构造:

1、递归式查询,从根节点入手,查询多次(效率非常低,在此不作介绍)

2、一次性查询出所有数据,根据FatherTreeId,递归式查询泛型(效率高。只查询一次即可)我们介绍此种方法:

 首先,我们构造如下Model

    /// <summary>
    /// 我们要构造的树
    /// </summary>
    public class TreeModel
    {
        public TreeModel()
        {
            children = new List<TreeModel>();
        }
        public string title { get; set; }
        public string value { get; set; }
        public string key { get; set; }
        public List<TreeModel> children { get; set; }

        public static TreeModel MakeTree(TreeTableModel supplierClassifyModels)
        {
            TreeModel Tree = new TreeModel();
            Tree.title = supplierClassifyModels.NodeName;
            Tree.key = supplierClassifyModels.TreeId;
            Tree.value = supplierClassifyModels.TreeId;
            if (supplierClassifyModels.children != null)
            {
                foreach (var item in supplierClassifyModels.children)
                {
                    Tree.children.Add(MakeTree(item));
                }
            }
            return Tree;
        }
    }
    

    /// <summary>
    /// 数据库表对应的实体Model
    /// </summary>
    public class TreeTableModel
    {
        public TreeTableModel()
        {
            children = new List<TreeTableModel>();
        }
        public string TreeId { get; set; }
        public string NodeName { get; set; }
        public string FatherTreeId { get; set; }
        //子数据
        public List<TreeTableModel> children { get; set; }
    }
View Code

相关文章:

  • 2021-12-31
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-11-30
  • 2021-12-19
猜你喜欢
  • 2021-11-18
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案