Pекурсивный обход таблиц с помощью ORM

44 views
Skip to first unread message

Alex A.

unread,
Jan 26, 2017, 9:51:25 AM1/26/17
to dotnetconf
Здравствуйте, меня интересует рекурсивный обход таблиц с помощью ORM технологий и в частности с помощью ADO.NET Entity Framework.
Поясню задачу, которую мне надо решить: У меня в базе данных есть несколько таблиц с внешним ключом (foreign key) на самих себя, т.е. есть столбик с указателем идентификационного номера родителя (0 если это корень). В моем коде есть сущности для каждой такой таблице, которые содержат списки с дочерними сущностями, а те со своими дочерними сущностями и т.д. Меня интересует создать за один Linq.Select(Expression<Tin, Tout>) всю иерархию для конкретной строки (записи) в таблице. 
Так вот вопрос: можно ли это сделать в Entity Framework? Можно ли это сделать с другой ORM технологией? И как вы поступаете в подобных случаях в своих проектах?
Заранее благодарен.

Артём Мурадов

unread,
Jan 26, 2017, 12:55:04 PM1/26/17
to dotnetconf
Когда у меня была подобная задача (лет 10 назад :) ), я писал SQL руками и мапил результат на сущность. 

четверг, 26 января 2017 г., 15:51:25 UTC+1 пользователь Alex A. написал:

Artur Drobinskiy

unread,
Jan 26, 2017, 9:17:57 PM1/26/17
to dotne...@googlegroups.com
http://stackoverflow.com/a/11565717/291695, я удивлен, что никто другой раньше не поделился этой ссылкой :)

Если сущностей в дереве в целом немного, можно вытащить всю таблицу в память: context.Table.ToList(); и внутри все иерархические ссылки будут работать. Конечно, это только в случае небольшого объема данных.

26 января 2017 г., 21:51 пользователь Alex A. <aagr...@gmail.com> написал:

--

---
Вы получили это сообщение, поскольку подписаны на группу "dotnetconf".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес dotnetconf+unsubscribe@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

Alexander Zaytsev

unread,
Jan 26, 2017, 9:51:01 PM1/26/17
to dotne...@googlegroups.com
Но я делился этой ссылкой в группе;) Сегодня ещё не было времени отвечать.

С уважением,
Александр
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес dotnetconf+...@googlegroups.com.

Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

--

---
Вы получили это сообщение, поскольку подписаны на группу "dotnetconf".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес dotnetconf+...@googlegroups.com.

Alew

unread,
Jan 27, 2017, 5:28:16 AM1/27/17
to dotne...@googlegroups.com

Еще можно погуглить ordpath

Message has been deleted

Alex A.

unread,
Jan 29, 2017, 4:37:17 AM1/29/17
to dotnetconf
Большое спасибо всем, кто ответил. Появилась почва, для размышлений. Насколько я понимаю, нет пути сделать обход с помощью Entity Framework. Однако, мне все-таки интересно, можно ли сделать подобное с помощью другого ORM, например NHibernate или ещё какого-нибудь. Ну и если мы уже заговорили о других ORM, какие ORM вам известны, кроме Entity Framework и NHibernate , работающие с .NET технологиями.

Чапаев

unread,
Jan 29, 2017, 7:15:02 AM1/29/17
to dotnetconf
такую вещь надо решать применением другого алгоритма хранения дерева, как например вот тут https://habrahabr.ru/post/193166/.
основная идея - у узла хранить ссылку на левого и правого потомка. тогда одним sql запросом вы сможете вытянуть всех потомков одного узла.
а в схеме родитель потомок \то невозможно алгоритмически, поэтому никакими запросами вы не сделаете это, если в субд нет каких нибудь инструментов для этого

четверг, 26 января 2017 г., 17:51:25 UTC+3 пользователь Alex A. написал:
Reply all
Reply to author
Forward
0 new messages