Ved at bruge linq2sql kunne du gøre:
List<PageInfo> GetHierarchicalPages()
{
var pages = myContext.PageInfos.ToList();
var parentPages = pages.Where(p=>p.ParentId == null).ToList();
foreach(var page in parentPages)
{
BuildTree(
page,
p=> p.Pages = pages.Where(child=>p.pageId == child.ParentId).ToList()
);
}
}
void BuildTree<T>(T parent, Func<T,List<T>> setAndGetChildrenFunc)
{
foreach(var child in setAndGetChildrenFunc(parent))
{
BuildTree(child, setAndGetChildrenFunc);
}
}
Forudsat at du definerer en Pages-egenskab i PageInfo som:
public partial class PageInfo{
public List<PageInfo> Pages{get;set;}
}
Behandlingen for at få det på et hierarki sker på webapplikationssiden, hvilket undgår ekstra belastning på sql-serveren. Bemærk også, at denne type info er en perfekt kandidat til at cache.
Du kan lave gengivelsen som Rex nævnte. Alternativt kan du udvide en smule på denne implementering og få den til at understøtte hierarkiets grænseflader og bruge asp.net-kontroller.
Opdatering 1: For den gengivelsesvariation, du spurgte om i en kommentar, kan du:
var sb = new System.IO.StringWriter();
var writer = new HtmlTextWriter(sb);
// rex's rendering code
var html = sb.ToString();