Sử dụng linq2sql bạn có thể làm gì:
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);
}
}
Giả sử bạn xác định thuộc tính Pages trong PageInfo như:
public partial class PageInfo{
public List<PageInfo> Pages{get;set;}
}
Quá trình xử lý để đưa nó vào một hệ thống phân cấp đang diễn ra ở phía ứng dụng web, điều này giúp tránh tải thêm trên máy chủ sql. Cũng lưu ý rằng loại thông tin này là một ứng cử viên hoàn hảo để lưu vào bộ nhớ cache.
Bạn có thể thực hiện kết xuất như Rex đã đề cập. Ngoài ra, bạn có thể mở rộng một chút về triển khai này và làm cho nó hỗ trợ các giao diện phân cấp và sử dụng các điều khiển asp.net.
Cập nhật 1: Đối với biến thể hiển thị mà bạn đã hỏi trong một nhận xét, bạn có thể:
var sb = new System.IO.StringWriter();
var writer = new HtmlTextWriter(sb);
// rex's rendering code
var html = sb.ToString();