sql >> Database >  >> RDS >> Sqlserver

Retourneert ongeordende lijst van hiërarchische sql-gegevens

Met linq2sql zou je het volgende kunnen doen:

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

Ervan uitgaande dat u een Pages-eigenschap definieert in de PageInfo zoals:

public partial class PageInfo{
   public List<PageInfo> Pages{get;set;}
}

De verwerking om het in een hiërarchie te krijgen, vindt plaats aan de kant van de webtoepassing, waardoor extra belasting van de sql-server wordt vermeden. Merk ook op dat dit soort informatie een perfecte kandidaat is om te cachen.

Je kunt de render doen zoals Rex zei. Als alternatief kunt u deze implementatie een beetje uitbreiden en de hiërarchie-interfaces laten ondersteunen en asp.net-besturingselementen gebruiken.

Update 1: Voor de weergavevariatie die je bij een opmerking hebt gevraagd, kun je:

var sb = new System.IO.StringWriter();
var writer = new HtmlTextWriter(sb);
// rex's rendering code
var html = sb.ToString();


  1. MySQL-triggers gebruiken om alle tabelwijzigingen in een secundaire tabel te loggen

  2. MySQL Storage Engine-optimalisatie:InnoDB-optimalisatie configureren voor hoge prestaties

  3. Groeperen op datum, rij terug, zelfs als er geen records zijn gevonden

  4. Hulp nodig bij het koppelen van Oracle-tabellen in MS Access