我正在进入动态数据网站(非常强大)并享受它。但是,我要求我似乎无法满足。我有一个自联接类别表(Id,Name,ParentId)来创建一个分层类别结构(例如,具有空id的类别是顶级的,通常的类型)。然后我有一个产品表,其中包含该类别的外键。
在动态数据网站中,我自动生成了类别下拉列表;但它只是按数字顺序列出所有类别。我想要的(以及我之前编码的,动态前数据)是一个缩进列表,按层次排列的类别列表。
我是否要更换现有的FilterUserControl?我可以在任何地方覆盖PopulateListControl方法吗?有没有人有任何LINQ语法来提取自连接的分层数据?
只需指点和建议即可,感谢您提供的任何帮助。
亲切的问候,
迈克金斯科特答案 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
在这些情况下我经常使用的是左右树。这些对于查询数据是有效的。最重要的是,我有一个特定的层来加载和保存我的树。这将从数据库中获取所有子项并在内存中加载树。该层还负责移动树内的节点,删除节点等。一旦你在内存中组织了一棵树,你就可以从那里做任何事情。希望有所帮助,如果您需要一些通用左/右树的代码示例,请告诉我。