Pregunta

Estoy trabajando con un gran conjunto de datos jerárquicos en un servidor SQL modelado usando el estándar " EntityID, ParentID " tipo de enfoque Hay alrededor de 25,000 nodos en todo el árbol.

A menudo necesito acceder a los subárboles del árbol y luego a los datos relacionados que cuelgan de los nodos del subárbol. Construí una capa de acceso a datos hace unos años basada en funciones con valores de tabla, utilizando consultas recursivas para obtener un subárbol arbitrario, dado el nodo raíz del subárbol.

Estoy pensando en usar Entity Framework, pero no puedo ver cómo consultar datos jerárquicos como esta. AFAIK no hay consultas recursivas en Linq, y no puedo exponer un TVF en el modelo de datos de mi entidad.

¿Es la única solución para seguir usando procs almacenados? ¿Alguien más ha resuelto esto?

Aclaración: Por 25,000 nodos en el árbol me refiero al tamaño del conjunto de datos jerárquico, no a nada que tenga que ver con los objetos o el Entity Framework.

¿Fue útil?

Solución

Lo mejor es usar un patrón llamado "Conjunto anidado", que le permite obtener un subárbol arbitrario dentro de una consulta. Esto es especialmente útil si los nodos no se manipulan muy a menudo: Administración de datos jerárquicos en MySQL .

En un mundo perfecto, el marco de la entidad proporcionaría posibilidades para guardar y consultar datos utilizando este patrón de datos.

Otros consejos

Todo es posible con Entity Framework, pero tienes que hackear y recortar tu camino hacia él. La base de datos en la que estoy trabajando actualmente tiene demasiadas " tablas de titulares " ya que los puntos, por ejemplo, se comparten con equipos y usuarios. Tanto los usuarios como los equipos también pueden tener un blog.

Cuando dices 25 000 nodos, ¿te refieres a las propiedades de navegación? Si es así, creo que podría ser difícil obtener el acceso a los datos. No es difícil navegar, buscar, etc. con el marco de la entidad, pero tiendo a modelar en papel y luego crear la base de datos en función de cómo quiero navegar al utilizar el marco de la entidad. Parece que no tienes esa opción.

Gracias por estas sugerencias.

Estoy empezando a darme cuenta de que la respuesta es remodelar los datos en la base de datos, ya sea siguiendo las líneas de conjuntos anidados como sugiere Georg, o tal vez una tabla de cierre transitiva, que acabo de encontrar.

De esa manera, espero obtener dos beneficios clave:

a) consulta más rápida entre subárboles arbitrarios

b) un modelo de datos que ya no requiere consultas recursivas, ¡por lo que quizás sea posible tenerlo al alcance de Entity Framework!

Siempre es sorprendente la frecuencia con la que la respuesta correcta a un problema difícil no es responderlo, ¡sino hacer otra cosa!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top