使用asp.net和sql server显示多级嵌套产品类别?

时间:2010-06-09 08:56:05

标签: asp.net sql-server stored-procedures parent-child

我有一个产品类别表,其中包含以下字段:

cat_id(PK)

Cat_name

Cat_desc

Parent_Cat_Id

现在,当用户想要添加产品时,他应该能够从列表框中选择多个类别(多选的enabaled)。但是为了让用户知道类别的层次结构,我需要以下列样式显示它们:

父类别1

父类别1->子类别1

父类别1->子类别1->子子类别1

父类别1->子类别1->子子类别2

父类别1->子类别2

父类别2

...

我知道要实现这一点,我需要使用递归编程。但是我们如何通过存储过程来实现呢?那会更有效率,对吗?

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

这就是你想要的。此存储过程使用“CTE”或“公用表表达式”。我不是他们的专业人士,但他们非常有用。绝对推荐查找它们。

SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE GetRecursiveTest
AS
BEGIN
    ;WITh Tree (cat_id, cat_name, parent_cat_id, level, Sort) AS
    (
        SELECT cat_id, cat_name, parent_cat_id, 0 AS level, 
            CONVERT(varchar(255), cat_name) AS Sort 
        FROM RecursiveTest
        WHERE parent_cat_id = 0

        UNION ALL

    SELECT RT.cat_id, RT.cat_name, RT.parent_cat_id, Parent.level + 1 AS level, 
        CONVERT(varchar(255), Parent.Sort + ' -> ' + RT.cat_name) AS Sort
        FROM RecursiveTest RT
        INNER JOIN Tree as Parent ON Parent.cat_id = RT.parent_cat_id
    )

    SELECT Sort FROM Tree
    ORDER BY Sort
END
GO

实际上,如果您将最后一次选择更改为“selct * from tree”,您将获得有关层次结构的更多数据。

这是指向CTE's

的良好资源的链接

答案 1 :(得分:0)

您使用的是Linq吗?

如果您使用LINQ,我建议添加一个新属性,该属性仅代表所有parentcategorys的类别,并在那里使用递归,因此您可以轻松地在asp.net中访问它