none
En una jerarquia cómo se listan en LINQ todos los hijos que componen el padre RRS feed

  • Pregunta

  • ¡Buenos días!

    En un procedimiento almacenado sería de la siguiente forma:

    ALTER PROCEDURE [dbo].[uo_OrdenHijo_en_OrdenPadre]

    @OrdenPadre  varchar(25)

    AS


    BEGIN
           

    WITH TablaOrdenesHijas AS (SELECT     Dato
                                FROM         dbo.Historico
                                WHERE      (Orden = @OrdenPadre)
                                UNION ALL
                                SELECT     e.Dato
                                FROM         dbo.Historico AS e INNER

    JOIN
                                                      TablaOrdenesHijas AS cte ON e.Orden =

    cte.DatoNCR)
        SELECT     DatoNCR
         FROM         TablaOrdenesHijas AS TablaOrdenes


    END
    GO

    ¿Cómo se haría el LINQ?. Gracias por la ayuda.

    lunes, 19 de abril de 2010 11:17

Respuestas

  • En el procedimiento almacenado estás usando una CTE recursiva. LINQ por sí solo no es recursivo, por lo que no es capaz de generar una sentencia de ese tipo. Pero podrías meter una consulta LINQ dentro de una rutina recursiva para conseguir el mismo efecto:

    private List<string> ListarHijos(int ordenPadre)
    {
      var q = from x in dc.TablaOrdenesHijas
          where x.Orden==ordenPadre
          select x;
      List<string> lista = new List<string>();
      foreach (var x in q)
      {
        lista.Add(x.Dato);
        lista.Addrange(ListarHijos(x.Orden));
      }
      return lista;
    }

    Por supuesto, esto generará múltiples sentencias dirigidas al servidor, así que no será igual de eficiente que la CTE. Si lo quieres optimizar, siempre puedes dejar la CTE en un procedimiento almacenado, y añadir ese procedimiento al dbml para que te genere una llamada desde el DataContext.

     

    • Marcado como respuesta CorsarioVasco viernes, 23 de abril de 2010 23:25
    viernes, 23 de abril de 2010 20:27

Todas las respuestas

  • En el procedimiento almacenado estás usando una CTE recursiva. LINQ por sí solo no es recursivo, por lo que no es capaz de generar una sentencia de ese tipo. Pero podrías meter una consulta LINQ dentro de una rutina recursiva para conseguir el mismo efecto:

    private List<string> ListarHijos(int ordenPadre)
    {
      var q = from x in dc.TablaOrdenesHijas
          where x.Orden==ordenPadre
          select x;
      List<string> lista = new List<string>();
      foreach (var x in q)
      {
        lista.Add(x.Dato);
        lista.Addrange(ListarHijos(x.Orden));
      }
      return lista;
    }

    Por supuesto, esto generará múltiples sentencias dirigidas al servidor, así que no será igual de eficiente que la CTE. Si lo quieres optimizar, siempre puedes dejar la CTE en un procedimiento almacenado, y añadir ese procedimiento al dbml para que te genere una llamada desde el DataContext.

     

    • Marcado como respuesta CorsarioVasco viernes, 23 de abril de 2010 23:25
    viernes, 23 de abril de 2010 20:27
  • Gracias Alberto

     

    viernes, 23 de abril de 2010 23:26