#c# #sql #linq
#c# #sql #linq
Вопрос:
Допустим, у меня есть набор данных, подобный этому:
PersonId | ManagerId | DepartmentId
========================================
1 null 1
2 1 1
3 1 2
4 2 1
и так далее.
Я ищу запрос Linq, который:
Заданный ManagerID и набор DepartmentIds выдадут мне все соответствующие PersonID. Запрос должен возвращать все идентификаторы персон для менеджера по всему дереву, а не только те, которые находятся непосредственно под этим менеджером.
Вот что я пробовал до сих пор:http://pastebin.com/zF9dq6wj
Спасибо! Крис.
Комментарии:
1. Вздох. Что вы пробовали, как это не сработало, какие исследования вы провели, чтобы попытаться найти решение и т.д.
2. Ваше дерево имеет статические 3 уровня?
3. Привет, нет — теоретически у него может быть неограниченное количество уровней. Спасибо.
4. Что вы имеете в виду под:
The query should return all PersonIds under a manager, all the way down the tree, not just those immediately under that manager
и как это согласуется с набором данных, который вы показываете в качестве примера? Неважно: p не смотрел, теперь понял.5. Я думаю, что вам не хватает самоссылки FK в вашем описании
Ответ №1:
Используя Linq, нет автоматического способа сделать это (о котором я когда-либо слышал) без многократных обращений к базе данных. Таким образом, это действительно ничем не отличается от любой другой структуры рекурсивных вызовов, и вы можете выбирать между вызовами рекурсивных методов, некоторое время с системой.Коллекции.Объект очереди (или стека) для идентификаторов и т.д. Если вашей серверной базой данных является SQL Server 2008 или выше, вы можете воспользоваться ее возможностями рекурсивного запроса, но для этого вам придется вызвать sproc, поскольку Linq не сможет выполнить перевод самостоятельно.
Ответ №2:
Вы не можете выполнять рекурсивные запросы в Linq2SQL или Linq2Entities. Я бы предложил написать представление с CTE и добавить его в ваш DataContext-файл.