Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Връща неподреден списък от йерархични sql данни

С помощта на 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;}
}

Обработката за получаването му в йерархия се извършва от страна на уеб приложението, което избягва допълнително натоварване на sql сървъра. Също така имайте предвид, че този тип информация е перфектен кандидат за кеширане.

Можете да направите рендирането, както спомена Rex. Като алтернатива можете да разширите малко тази реализация и да я накарате да поддържа йерархичните интерфейси и да използва asp.net контроли.

Актуализация 1: За варианта на изобразяване, който поискахте в коментар, можете:

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. Изтриване на дублиращи се записи само с една заявка

  2. SSIS:Как използвате повторно скрипт в скриптов компонент в друг пакет?

  3. Как да изберете данни от 30 дни?

  4. как да се покаже стойността на колоната само веднъж, ако се повтаря и е празна, докато в sql не дойде различна стойност

  5. Как да направя търсене, чувствително към малки и големи букви в клауза WHERE (използвам SQL Server)?