Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Restituisce l'elenco non ordinato dai dati sql gerarchici

Usando linq2sql potresti fare:

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

Supponendo che tu definisca una proprietà di Pages in PageInfo come:

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

L'elaborazione per ottenerlo su una gerarchia avviene sul lato dell'applicazione Web, che evita un carico aggiuntivo sul server sql. Tieni inoltre presente che questo tipo di informazioni è un candidato perfetto per la cache.

Puoi eseguire il rendering come menzionato da Rex. In alternativa è possibile espandere un po' questa implementazione e far sì che supporti le interfacce della gerarchia e utilizzi i controlli asp.net.

Aggiornamento 1: Per la variazione di rendering che hai chiesto su un commento, puoi:

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