动态数据站点下拉列表中的分层数据

时间:2009-01-30 14:38:32

标签: c# asp.net dynamic-data

我正在进入动态数据网站(非常强大)并享受它。但是,我要求我似乎无法满足。我有一个自联接类别表(Id,Name,ParentId)来创建一个分层类别结构(例如,具有空id的类别是顶级的,通常的类型)。然后我有一个产品表,其中包含该类别的外键。

在动态数据网站中,我自动生成了类别下拉列表;但它只是按数字顺序列出所有类别。我想要的(以及我之前编码的,动态前数据)是一个缩进列表,按层次排列的类别列表。

我是否要更换现有的FilterUserControl?我可以在任何地方覆盖PopulateListControl方法吗?有没有人有任何LINQ语法来提取自连接的分层数据?

只需指点和建议即可,感谢您提供的任何帮助。

亲切的问候,

迈克金斯科特

2 个答案:

答案 0 :(得分:2)

在Oracle中:

SELECT  LEVEL, Id, Name, LPAD(' ', LEVEL) || Name AS IndentedName
FROM    Categories
START WITH
        ParentID IS NULL
CONNECT BY
        ParentID = PRIOR Id
ORDER SIBLINGS BY
        Name

您可以使用IndentedName或根据LEVEL伪列进行自定义格式设置(显示每个类别的深度)

P.S。使用bad作为顶级父ID是NULL的想法,因为您无法使用索引来访问它。请改用0

<强>更新

SQL Server

WITH    q (id, parentid, name, level, bc) AS
        (
        SELECT  id, parentid, name, 1, CAST(ROW_NUMBER() OVER (ORDER BY name) AS VARCHAR(MAX))
        FROM    Categories
        WHERE   ParentID IS NULL
        UNION ALL
        SELECT  c.id, c.parentid, c.name, q.level + 1, q.bc + '.' + CAST(ROW_NUMBER() OVER (ORDER BY c.name) AS VARCHAR(MAX))
        FROM    q
        JOIN    Categories c
        ON      c.parentId = q.id
        )
SELECT  *
FROM    q
ORDER BY
        bc

Oracle不同,SQL Server索引NULL值,因此可以使用NULL来标记最终祖先。

答案 1 :(得分:2)

SQL Server具有分层数据类型。没用过但看起来很有趣。 http://msdn.microsoft.com/en-us/magazine/cc794278.aspx

在这些情况下我经常使用的是左右树。这些对于查询数据是有效的。最重要的是,我有一个特定的层来加载和保存我的树。这将从数据库中获取所有子项并在内存中加载树。该层还负责移动树内的节点,删除节点等。一旦你在内存中组织了一棵树,你就可以从那里做任何事情。希望有所帮助,如果您需要一些通用左/右树的代码示例,请告诉我。