小编典典

如何以层次结构显示非规范化数据?

sql

我的问题是我想按层次结构显示数据,如下所示:

  • Democrat
    County Clerk
    Candidate 1
    Candidate 2
    Magistrate
    Candidate 1
    Candidate 2
    *Candidate 3

但是我正在像这样检索数据集:

Party | Office | Candidate
--------------------------------------------
Democrat | County Clerk | Candidate 1
Democrat | County Clerk | Candidate 2
Democrat | Magistrate | Candidate 1
Democrat | Magistrate | Candidate 2
Democrat | Magistrate | Candidate 3

我计划使用嵌套的中继器,但是我需要一个不同的Party值,然后才需要该聚会中不同的办公室名称值。

是否有.NET函数可以轻松完成我要尝试的操作?除了转发器以外,还有更好的显示信息的方法吗?

提前致谢!


阅读 177

收藏
2021-04-07

共1个答案

小编典典

如果可以修改存储过程,则建议以邻接表的形式显示结果集:

ID    Name          ParentID
1     Democrat      NULL
2     County Clerk  1
3     Magistrate    1
4     Candidate 1   2
5     Candidate 2   2
6     Candidate 1   3
7     Candidate 2   3
8     Candidate 3   3

它减少了检索到的数据量,并允许您针对父子关系进行递归编程。您只需从根开始。通过直接在StringBuilder中构建字符串文字,此方法避免了使用嵌套重复器的麻烦。

StringBuilder sb = new StringBuilder();
DataTable dt = new DataTable();
someDataAdapter.Fill(dt);

// find the roots:
DataRow[] roots = dt.Select("parentId is null");

sb.Append("<ul>");
foreach (DataRow child in roots)
{
    WriteNode(child, sb);
}
sb.Append("</ul>");


// recursively write out each node
public static void WriteNode(DataRow row, StringBuilder sb) {
    sb.Append("<li>"); 
    sb.Append(row["Name"]);

    // find children rows...
    DataRow[] children = row.Table.Select("parentId = " + row["id"].ToString());
        if (children.Length > 0)
        {
            sb.Append("<ul>");
            foreach (DataRow child in children)
            {
                WriteNode(child, sb);
            }
            sb.Append("</ul>");
        }

        sb.Append("</li>");
    }
2021-04-07