5

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

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

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

只是指针和建议就可以了,感谢您提供的任何帮助。

亲切的问候,

迈克·金斯科特

4

2 回答 2

2

在甲骨文中:

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伪列自定义格式(它显示每个类别的深度)

PS 最好bad用作NULL顶级父 ID,因为您不能使用索引来访问它。改用 a 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值不同,因此可以使用 aNULL来标记最终祖先。

于 2009-01-30T14:54:46.080 回答
2

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

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

于 2009-11-20T23:20:13.493 回答