Я играю с HierarchyId, и я не нашел способ, основанный на множестве, чтобы сделать следующее:
- вставить все поддерево сразу
- получить все поддерево одновременно
Этот вопрос связан с моим предыдущим , и я подозреваю, что единственный способ выполнить эти две задачи с HierarchyId - это один узел или один уровень за раз. Если я использую материализованный путь, оба действия легко выполняются одной (и тривиальной) командой на основе набора.
Что мне не хватает?
Изменить: я также пропустил способ перемещения поддерева, но я узнал об этом из комментария Микаэля Эрикссона
Ответы:
Используемая функция - GetReparentedValue, но при использовании только
GetReparentedValue
дерева может оказаться в «несовместимом» состоянии.Вот некоторый код, предоставленный Microsoft, который заботится об этом. Перемещение поддеревьев .
Я думаю, что это связано с применением дерева . Он использует вычисляемый столбец для родительского идентификатора, который самостоятельно присоединяется к PK.
источник
Извлечь целое поддерево просто - используйте
IsDescendentOf
метод согласно MSDNВставка является более сложной, но ваша основная проблема будет связана с вашими ограничениями - вы, очевидно, не можете вставить дочерние объекты, пока их родитель не будет зафиксирован. В этом случае либо выполните итерацию и вставку в иерархическом порядке, либо отключите ограничения и вставьте.
При вставке большого количества данных - миграции, пакетной или массовой вставки и т. Д. - я бы отключил ограничение. При оперативной вставке я бы выполнял итерацию, так как я не сталкивался с экземплярами во время работы системы, когда большие объемы больших объемов должны быть вставлены в иерархию.
источник