Как использовать инфраструктуру сущности с иерархическими данными?

Я работаю с большим набором иерархических данных в sql-сервере, смоделированным с использованием стандартного подхода EntityID, ParentID. Во всем дереве насчитывается около 25 000 узлов.

Мне часто нужно получить доступ к поддеревьям дерева, а затем получить доступ к связанным данным, зависающим от узлов поддерева. Несколько лет назад я построил слой доступа к данным на основе табличных функций, используя рекурсивные запросы для получения произвольного поддерева, учитывая корень node поддерева.

Я думаю об использовании Entity Framework, но я не вижу, как запрашивать иерархические данные, например это. AFAIK в Linq нет рекурсивного запроса, и я не могу выставить TVF в моей модели данных сущности.

Является единственным решением для сохранения хранимых процедур? Кто-нибудь еще решил это?

Уточнение: на 25 000 узлов в дереве я имею в виду размер иерархического набора данных, а не что-то связанное с объектами или инфраструктурой Entity Framework.

Ответ 1

Он может наилучшим образом использовать шаблон под названием "Вложенный набор", который позволяет получить произвольное поддерево в одном запросе. Это особенно полезно, если узлы не обрабатываются очень часто: Управление иерархическими данными в MySQL.

В идеальном мире инфраструктура сущности предоставит возможности сохранять и запрашивать данные с использованием этого шаблона данных.

Ответ 2

Все возможно с Entity Framework, но вы должны взломать и снести к нему свой путь. В базе данных, с которой я работаю в настоящее время, слишком много "таблиц держателей", поскольку точки, например, совместно используются обеими командами и пользователями. У пользователей и команд также есть блог.

Когда вы говорите 25 000 узлов, вы имеете в виду навигационные свойства? Если это так, я думаю, что было бы сложно получить доступ к данным на месте. Это не сложно ориентироваться, искать и т.д. С инфраструктурой сущностей, но я склонен моделировать на бумаге, а затем создавать базу данных на основе того, как я хочу перемещаться при использовании структуры сущностей. Похоже, что у вас нет этой опции.

Ответ 3

Спасибо за эти предложения.

Я начинаю понимать, что ответ заключается в том, чтобы реконструировать данные в базе данных - либо по строкам вложенных множеств, сколько предлагает Георг, или, может быть, транзитная таблица закрытия, с которой я только что столкнулся.

Таким образом, я надеюсь получить два основных преимущества:

a) более быстрый запрос на произвольные поддеревья

b) модель данных, которая больше не требует рекурсивного запроса - поэтому, возможно, она легко доберется до Entity Framework!

Всегда удивительно, как часто правильный ответ на сложную проблему - не отвечать на него, а делать что-то другое!