Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Trả về danh sách không có thứ tự từ dữ liệu sql phân cấp

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();


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bất kỳ nhược điểm nào của WITH RECOMPILE đối với các quy trình proc được lưu trữ trên SQL Server hàng tháng?

  2. Làm cách nào để trích xuất chuỗi con cụ thể này trong SQL Server?

  3. PIVOT / UNPIVOT trong SQL Server 2008

  4. Tên phiên bản mặc định của SQL Server Express

  5. UDF vô hướng trong SQL Server là gì?