Menggunakan linq2sql Anda dapat melakukan:
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);
}
}
Dengan asumsi Anda mendefinisikan properti Pages di PageInfo seperti:
public partial class PageInfo{
public List<PageInfo> Pages{get;set;}
}
Pemrosesan untuk mendapatkannya pada hierarki terjadi di sisi aplikasi web, yang menghindari beban tambahan pada server sql. Perhatikan juga bahwa jenis info ini adalah kandidat yang sempurna untuk disimpan di cache.
Anda dapat melakukan render seperti yang disebutkan Rex. Atau Anda dapat sedikit memperluas implementasi ini dan membuatnya mendukung antarmuka hierarki dan menggunakan kontrol asp.net.
Pembaruan 1: Untuk variasi rendering yang Anda tanyakan pada komentar, Anda dapat:
var sb = new System.IO.StringWriter();
var writer = new HtmlTextWriter(sb);
// rex's rendering code
var html = sb.ToString();