нас есть дерево:
Директор
---Секретарь
------Менеджер
------Старший менеджер
Поисковой запрос: менеджер
Я сначала ищу по фильтру. Для найденых элементов я нахожу всех предков. Потом Я создаю дерево до корня и добавляю в общую коллекцию.
Но получается следующим образом:
Директор
---Секретарь
------Менеджер
Директор
---Секретарь
------Старший менеджер
Хотя должно быть как в первом примере. В таком случае придется как то объединять деревья с элементами дерева. Пока в голову ничего не приходит как это сделать нормально.
Я бы расплющил дерево в список и в нем искал что нужно. Расплющивание можно в отдельный extension вынести, который принимает вершину и Func<T, T>, довольно часто нужная операция (гугли flatten tree, если это кажется сложным)
Так ef core при запросе where выдает плоский список. Зачем мне использовать flatten? К тому же selectmany делает тоже самое что и flatten. Возможно я вас не правильно понял
Ну так нужно сразу писать что речь про EF. Простой select тебе итак список вернет, в чем вопрос-то тогда?
Простой селект возвращает мне просто элементы подходящие по условию. Данные элементы мне нужно выстроить в дерево. Тоесть если какой то дочерний элемент подходит по условию, то мне нужно вырисовать дерево до корня и вернуть его. Если есть несколько элементов на разных уровнях, то, соответственно, должно быть одно дерево включающее эти элементы, а не несколько деревьев для каждого элемента
Делаешь include и оно само все выстроит, нужно только вершину найти
своего рода так можно заменить CTE ?
Ни разу не пользовался CTE с EF'ом
Это университетская задача для типичного SQL-я, зачем в EF такое городить?
т.е. мне будет достаточно иметь ID и ParentID для выстраивания правильной иерархии?
В EF ничего не нужно городить
Такая штука называется рекурсивный запрос https://habr.com/ru/post/43955/
У человека EF, зачем ему голый SQL? К тому же нужный запрос делается одной строкой типа db.Employees.Include(e => e.Childs).ToListAsync() Там будет нужная иерархия, нужно только вершину найти
> db.Employees.Include(e => e.Parent).ToListAsync() такой строкой разве можно вытянуть вершину начиная с ParentID == null ?
Немного не так, поменял
а если разные таблицы по аналогии?
Обсуждают сегодня