无限级的分类有若干个难点,包括:(1)数据表结构(2)展示符合使用者设想的分类结构层次,包括分类层次的编辑和通过SelectUI选择内容的分类归属两种情况(3)查询归属于某分类及其子类的内容。下面就这三种情况在EntityFramework4中的实现分别进行介绍。
数据表结构。依据实现方式的不同,表结构通常有两种。一种是不进行递归读取的表结构,其中有一个字段专门用来存放分类在整个结构中所处的层次位置。有人给它起了个名字叫“美好字段”。一种是有递归读取的,下面我们来做一下对比:
有递归读取的表结构:
-- Depth 深度字段,表现类别的层次结构时需要用到该字段 create table Categories( ID int identity(1,1) not null, CategoryName nvarchar(20) not null, ParentID int not null default(0), Depth int not null default(0), Sort int not null default(50) )
无递归读取的结构:
-- ParentPath 类别路径,记录类别处在结构层次中的位置的字段 create table Categories( ID int identity(1,1) not null, CategoryName nvarchar(20) not null, ParentID int not null default(0), ParentPath varchar(100) not null, Sort int not null default(50) )
对比一下,不难看出,无递归的版本多了一个字段:ParentPath。这个字段用来记录分类在结构层次中的位置,也可以借助它来找到分类的子孙类集合。由于在EntityFramework4中,数据的查询不再直接使用sql语句,而是直接操作对象和对象集(通过Linq),因此ParentPath字段在这种环境下变得难以处理了。当然也能够处理,只是实现的方式变得复杂了。
因此,我选择递归版的实现方式。第一部分完。第二部分将继续介绍无限级分类的两种呈现方式:Treeview 和 Select。
第二部分:无限级层次结构的表现和内容的读取