Med linq2sql kan du göra:
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);
}
}
Förutsatt att du definierar en Pages-egenskap i PageInfo som:
public partial class PageInfo{
public List<PageInfo> Pages{get;set;}
}
Bearbetningen för att få den i en hierarki sker på webbapplikationssidan, vilket undviker extra belastning på sql-servern. Observera också att denna typ av information är en perfekt kandidat att cache.
Du kan göra renderingen som Rex nämnde. Alternativt kan du expandera lite på den här implementeringen och få den att stödja hierarkigränssnitten och använda asp.net-kontroller.
Uppdatering 1: För renderingsvarianten du frågade 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();