十年河东,十年河西,莫欺少年穷。
学无止境,精益求精
难得有清闲的一上午,索性写篇博客。
首先,我们需要准备一张表,如下范例:
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('工程类','精装修类','设计类','营销类')
插入的数据,如下所示:
从上图,我们可以看出,这些数据中有四种大类,分别为:('工程类','精装修类','设计类','营销类'),层级关系通过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; } }