您的位置:首页 > 其它

一个比较高效的无限分类算法

2009-10-18 21:33 232 查看
      无限分类是我们做网站经常遇到的问题,一般我们建一个自关联的表,用一个字段表示父节点,如下商品分类表:

CREATE TABLE [dbo].[cityaddr](

    [id] [int] IDENTITY(1,1) NOT NULL,

    [parentid] [int] NOT NULL CONSTRAINT [DF_cityaddr_pid]  DEFAULT ((0)),

    [city] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL,

    [pstr] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,

    [rank] [int] NOT NULL CONSTRAINT [DF_cityaddr_level]  DEFAULT ((0)),

 CONSTRAINT [PK_cityaddr] PRIMARY KEY CLUSTERED 

(

    [id] ASC

)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]

) ON [PRIMARY

 

    添加了psrt字段,用来记录路径,路径中用“,”隔开,添加时只要将父节点的路径加上父节点表示即可。删除时加上where id=@id or pstr like ‘%,@id,%’,可删除全部子孙节点。获取路径 where id in (" + caddr.pstr.Trim(',')……

部分代码:

/// <summary>

        /// 获取路径:父->子

        /// </summary>

        public List<Fz.Model.cityaddr> GetPath(int addrid)

        {

            Model.cityaddr caddr = GetModel(addrid);

            if (!string.IsNullOrEmpty(caddr.pstr.Trim(',')))

            {

                return GetModelList("id in (" + caddr.pstr.Trim(',') + ") order by rank");

            }else{

                throw new Exception("没有父节点");

            }

        }

 

        /// <summary>

        /// 获取路径:父-子

        /// </summary>

        public string[] GetPathStr(int addrid)

        {

            

            List<Fz.Model.cityaddr> laddr = GetPath(addrid);

            string[] ret = new string[laddr.Count];

            for (int i = 0; i < laddr.Count;i++ )

            {

                if (!string.IsNullOrEmpty(laddr[i].city))

                {

                    ret[i] = laddr[i].city;

                }

            }

            return ret;

        }

 

        /// <summary>

        /// 获取所有子节点

        /// </summary>

        public List<Fz.Model.cityaddr> GetAllSon(int addrid)

        {

            string strwhere ="pstr like '%,"+ addrid + ",%' order by rank";

            return GetModelList(strwhere);

        }

 

        /// <summary>

        /// 获取子节点

        /// </summary>

        public List<Fz.Model.cityaddr> GetSon(int addrid)

        {

            return GetModelList("pid="+addrid);

        }

 

        /// <summary>

        /// 获取子节点,返回增加的项的d

        /// </summary>

        public int Add(int pid, string city)

        {

            Model.cityaddr ca = GetModel(pid);

            if (ca == null)

            {

                ca = new Fz.Model.cityaddr();

                ca.parentid = 0;

                ca.pstr = ",";

                ca.rank = 1;

            }

            else

            {

                ca.parentid = pid;

                ca.pstr = ca.pstr + pid + ",";

                ca.rank++;

            }

            ca.city = city;

            return Add(ca);

        }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: