Страницы

Поиск по вопросам

понедельник, 14 января 2019 г.

Как создать рекурсивный запрос к БД с помощью Entity Framework?

Здравствуйте, у меня есть проблема. Есть таблица категорий, которая выглядит так:
Задача при выборе категории высшей иерархии подтянуть все его подкатегории - создать коллекцию категорий дерева. Вопрос такой: как реализовать такую задачу с помощью Entity Framework? Возможно ли сделать это одним запросом к БД?
За любую помощь буду признателен)


Ответ

Entity Framework не умеет в рекурсивные запросы. Но проблему решить можно.
Вариант 1:
Сделать view на основе рекурсивного запроса на SQL используя WITH CTE. После чего в коде вызывать получение данных из этой вью.
Примерный код SQL:
CREATE VIEW [dbo].[vw_Subcategories] AS WITH cte ( CategoryID, SubcatID) AS ( SELECT Id AS SubcatID, RootId as CategoryID FROM dbo.TableName UNION ALL SELECT e.Id AS SubcatID, cte.Id AS CategoryID FROM cte INNER JOIN dbo.TableName AS e ON e.RootId = cte.Id )
Вариант 2:
Сделать простой отдельный рекурсивный метод в коде для получения дочерних EF-объектов:
List GoDownRecursive(int categoryId) { var res = new List();
foreach(var subcategory in DbContext.Cateogires.Where(c => c.RootId == categoryId) { res.Add(subcategory); res.AddRange(GoDownRecursive(subcategory.Id)); }
return res; }
Запросов к базе будет больше, но если вложенность небольшая и запрос не самый частый, то вариант приемлимый. При желании полученные деревья можно кэшировать.

Комментариев нет:

Отправить комментарий