sql >> Base de Datos >  >> RDS >> Sqlserver

Devuelve una lista desordenada de datos sql jerárquicos

Usando linq2sql podrías hacer:

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

Suponiendo que defina una propiedad de Páginas en PageInfo como:

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

El procesamiento para colocarlo en una jerarquía ocurre en el lado de la aplicación web, lo que evita una carga adicional en el servidor sql. También tenga en cuenta que este tipo de información es un candidato perfecto para almacenar en caché.

Puedes hacer el renderizado como mencionó Rex. Alternativamente, podría ampliar un poco esta implementación y hacer que sea compatible con las interfaces de jerarquía y usar controles asp.net.

Actualización 1: Para la variación de representación que solicitó en un comentario, puede:

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