0

我最近遇到了一个奇怪的问题。我在数据库中有一个名为 Task 的表。一个任务可能有一个父任务和多个子任务(自联接)。我编写了一个存储过程,它使用 CTE(公用表表达式)将项目中的所有任务及其子项和子项返回到 n 级。我需要的结果如下替代文字

结果成功实现。您可以在第一列中看到缩进以显示层次关系。问题是我以“糟糕的方式”做这件事。下面是我的查看代码

<table cellspacing="0">
    <%foreach (var it in Model.list.Where(x=>x.ParentID == null))
      {
          int x = 1;%>

        <tr>
            <td width="150"><div class="wrapper" style="width:18px;">&nbsp;</div><%:it.TOC %></td>
            <td><%:it.label %></td>
            <td><%:it.StartDate%></td>
            <td><%:it.EndDate%></td>
            <td><%:it.smallDescription %></td>
        </tr>
            <%=Model.CallRecursion(it,Model.list,ref x) %>


    <%} %>

您可以看到调用递归方法已在递归返回 html 字符串的模型上定义。下面是 CallRecursion 方法的代码。

public string CallRecursion(TempModel item, List<TempModel> all,ref int count) 
        {
            if(all.Where(x=>x.ParentID == item.ID).Count() == 0)
                return "";
            else
            {
                count++;
                string retval = "<tr>";
                foreach (var kids in all.Where(x => x.ParentID == item.ID)) 
                {
                    retval += "<td><div style='width:"+count*18+"px;' class='wrapper'>&nbsp;</div><span>" + kids.TOC + "</span></td><td>" + kids.label + "</td><td>" + kids.StartDate + "</td><td>" + kids.EndDate+"</td><td>"+kids.smallDescription+"</td></tr>"+
                        CallRecursion(kids, all,ref count);
                }
                count--;
                return retval;
            }


        }

我的问题是如何以更清洁的方式实现这一目标。我不知道我是否可以递归地调用部分视图来呈现 html,如果可以,动态会是什么。意见和建议表示赞赏。

4

1 回答 1

1

为什么不修改您的 CTE 以提供如下结果,指定每行在树中的哪个级别。以这种方式 SQL 已经在执行递归调用,那么为什么要在您的应用程序代码中重做这个。

通过这种方式,您的方法可以简化为仅将 乘以TreeLevel像素数量以给出正确的缩进。不需要递归。只需遍历生成的模型。

无论如何,我认为拥有每个项目 TreeLevel 会更有价值,因为您可能会做其他事情,例如“给我所有根节点的概述”,从而导致Number等于 1、2 和 3的行

TreeLevel Number  Other_data
0         1       ...
1         1.1     ...
1         1.2     ...
2         1.2.1   ...
2         1.2.1   ...
0         2       ...
1         2.1     ...
1         2.2     ...
2         2.1.2   ... 
3         2.1.2.1 ...
0         3       ...

关于 CTE,请查看 4guysfromrolla 的这篇文章,该文章展示了如何将层次结构 (TreeLevel) 值作为 CTE 结果集的一部分。

有关原始代码的其他注意事项 - 从代码构造 HTML 时使用 TagBuilder 类。IMO,那会更干净,更好。没有魔线建筑..

于 2010-10-22T07:07:24.433 回答