Если вы можете изменить структуру таблицы, добавив дополнительные поля, то один из подходов, которые я использовал в прошлом, - это иметь поле «Путь», которое содержит список идентификаторов, разделенных запятыми.
ID ParentID Name Path
-- -------- ---- ----
1 null x 1
2 null y 2
3 null z 3
4 null t 4
5 1 xx 1,5
6 1 xy 1,6
7 1 xz 1,7
8 2 yx 2,8
9 2 yy 2,9
10 9 yyx 2,9,10
11 10 yyxx 2,9,10,11
12 11 yyxxx 2,9,10,11,12
Затем вы можете выполнить запрос на основе поля Path, используя LIKE (или StartsWith в Linq)
В своем вопросе вы говорите, что хотите получить {1, 5, 6, 7, 10, 11, 12}, но эти идентификаторы являются частью двух разных поддеревьев, если я правильно понял.
Чтобы получить "х" и все это дети ...
where Path = "1" || Path.StartsWith("1,")
Чтобы просто получить детей х ...
where Path.StartsWith("1,")