У меня есть собственная таблица сотрудников, то есть сотрудники с первичным ключом «EmployeeID» и внешним ключом «SupervisorID» для родителя (супервизора). Менеджеры находятся на вершине иерархии, поэтому их SupervisorID равен нулю. Есть также столбец даты (CreatedOn), чтобы фильтровать по определенным датам, но только у менеджеров есть дата, а не их сотрудники. Я пытаюсь получить все результаты от конкретной даты, менеджеров и их сотрудников, но я просто не могу запустить ее. Мне нужно добиться этого с помощью LINQ, но я подумал, что сначала смогу выполнить SQL-запрос, чтобы посмотреть, смогу ли я каким-то образом перенести это в запрос LINQ (не имеет значения, какой синтаксис). Но это было очень иллюзорно, когда я понял, что это так же сложно, как в LINQ ... Я думал, что это может быть достигнуто с помощью CTE, но я не могу заставить себя работать. Либо я просто получаю менеджеров, либо ничего ... Вот пример таблицы:
------------------------------------------------------
|EmployeeID|Name |SupervisorID|CreatedOn |
|1 |Sanders |NULL |2019-01-01 16:20:33|
|2 |Flanders|1 |NULL |
|3 |Andrews |1 |NULL |
|4 |Ranger |NULL |2019-03-20 18:04:56|
|5 |Hammer |4 |NULL |
|6 |Enderson|4 |NULL |
|7 |Larsson |NULL |2019-10-03 04:55:16|
|8 |Simpson |8 |NULL |
------------------------------------------------------
Как видите, у Сандерса (2019-01-01 16:20:33) 2 сотрудника (Фландрия, Эндрюс), Ranger 2019-03-20 18:04:56 имеет 2 сотрудников (Хаммер, Эндерсон) и Ларссон (2019-10-03 04:55:16) имеет 1 сотрудника (Симпсон)
Я неполучить где-нибудь с LINQ. Если я отфильтрую дату, у меня больше не будет возможности отфильтровать начальный набор данных для сотрудников.
// This filters by date, but then I can't get the employees without date anymore
employees.Where(e => e.CreatedOn >= '2019-01-01' && e.CreatedOn < '2019-01-02')
// This filters all employees with a parent, but then I can't get the managers anymore and can't filter against a date anymore either
employees.Where(e => e.SupervisorID != null)
Я попробовал объединение, но это тоже не сработало:
from employees m in employees
join e in employees
on m.EmployeeId equals e.SupervisorID
where m.CreatedOn >= '2019-01-01' && m.CreatedOn < '2019-01-02'
select m
Ожидаемым набором результатов для соответствующего фильтра будут Сандерс и его сотрудники, поскольку запись Сандерса была создана 1 января и поскольку его сотрудники работают под ним:
------------------------------------------------------
|EmployeeID|Name |SupervisorID|CreatedOn |
|1 |Sanders |NULL |2019-01-01 16:20:33|
|2 |Flanders|1 |NULL |
|3 |Andrews |1 |NULL |
------------------------------------------------------
У кого-нибудь есть идеи, как мне этого добиться? Я не смогу изменить дизайн базы данных, поскольку могу только читать, а другое приложение отправляет данные, которые я не могу изменить.