2010-05-30 3 views
3

У меня есть модель, которая включает в себя NODES и RELATIONSHIPS (которые связывают узлы вместе, с помощью parent_node, child_node).Как я могу кодировать рекурсивный запрос в модели Entity Framework?

Q1 - Есть ли способ в EF/Linq-to-сущностях выполнить запрос на узлах (например, context.Nodes ..), чтобы найти в графике «все родители» или «или дети»?

Q2 - Если нет в Linq-to-entity, есть ли другой способ сделать это иначе, чем написать метод, который вручную проходит и делает это?

Q3 - Если руководство является единственным способом сделать это, следует ли мне беспокоиться о количестве обращений к базе данных, которые будут поступать в базу данных, поскольку метод продолжает рекурсию через данные? Или, более конкретно, есть ли функция кеширования EF, которая может помочь здесь в обеспечении эффективности метода с точки зрения «количества обращений к базе данных»?

благодарит

благодарит

ответ

1

Там нет такого элегантного способа Flaten дерева. вы можете (в хранимой процедуре или в инфраструктуре сущности) создать цикл, который будет выполняться до тех пор, пока не произойдет никакого изменения, в котором итерация вы привяжете родительский и дочерний дочерние элементы в какой-либо временной таблице или коллекции. , в конце концов, у вас будет коллекция родителей, successor two-ples.

+0

спасибо tsinik - в этом случае вы знаете, есть ли способ в EF эффективно не загружать какие-либо параметры для всех узлов, которые я собираю на графике, пока они не используются? т.е. ленивая загрузка на уровне атрибута? т.е. если я собираюсь загружать много объектов сущности в граф, я думал, что, по крайней мере, до тех пор, пока загружается только основной объект с отношениями FK, может быть лучше с позиции памяти – Greg

+0

столько, сколько я знаю, там не является ленивой нагрузкой на уровень атрибута, но вы можете сопоставить несколько объектов для каждой таблицы, чтобы вы могли разделить узел узла на 2 и иметь дело только с соответствующими данными. – tsinik

1

Когда вы используете Microsoft SQL Server 2005 или выше, вы можете использовать CTE (Common Table Expressions). Они позволяют определить рекурсивный запрос. В то время как SQL Server под обложками не намного больше, чем запуск нескольких запросов для вас, он делает это полностью на стороне сервера, поэтому он избавляет вас от большого количества клиент-серверной связи.

Вам нужно будет сделать это, используя сохраненный proc или обычный SQL-запрос, потому что EF не может сделать это для вас.

Смежные вопросы