linq2sql を使用すると、次のことができます:
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);
}
}
Pages プロパティを PageInfo で次のように定義するとします。
public partial class PageInfo{
public List<PageInfo> Pages{get;set;}
}
階層で取得する処理は Web アプリケーション側で行われるため、SQL サーバーへの余分な負荷が回避されます。また、このタイプの情報はキャッシュするのに最適な候補であることに注意してください。
レックスが述べたようにレンダリングを行うことができます。または、この実装を少し拡張して、階層インターフェイスをサポートし、asp.net コントロールを使用することもできます。
アップデート 1: コメントで尋ねたレンダリング バリエーションについては、次のことができます。
var sb = new System.IO.StringWriter();
var writer = new HtmlTextWriter(sb);
// rex's rendering code
var html = sb.ToString();