Не могу придумать, как это сделать в LINQ.Я удалил неиспользуемые столбцы.К счастью, это ограниченная иерархия.Я использую новый тип данных hierarchyid
, который имеет желаемый порядок сортировки:
create table UserPosts (
ID int not null,
ParentID int null
)
go
insert into UserPosts (ID,ParentID)
select 1,null union all
select 2,null union all
select 3,1 union all
select 4,2 union all
select 5,3 union all
select 6,1 union all
select 7,6
go
select
*
from
UserPosts up
left join
UserPosts up_1st
on
up.ParentID = up_1st.ID
left join
UserPosts up_2nd
on
up_1st.ParentID = up_2nd.ID
order by
CONVERT(hierarchyid,
COALESCE('/' + CONVERT(varchar(10),up_2nd.ID),'') +
COALESCE('/' + CONVERT(varchar(10),up_1st.ID),'') +
'/' + CONVERT(varchar(10),up.ID) + '/'
)
HierarchyID (в виде строк) выглядят как /GrandParent/Parent/Child/
- поэтому мы создаем значения, которые выглядят так.Очевидно, что если у нас нет прародителя (up_2nd.ID
равно нулю, так как мы не можем получить 2 левых соединения, как описано), то мы просто хотим построить /Parent/Child/
- это то, что 1-й КОАЛИС помогает нам достичь,Точно так же, если мы не можем найти каких-либо родителей (оба значения up_1st.ID
и up_2nd.ID
равны нулю), тогда оба COALESCE просто превращаются в пустые строки, и мы в конечном итоге создаем /ID/
.
Вы можете добавить:
CASE
WHEN up_2nd.ID is not null then 'Comment'
WHEN up_1st.ID is not null then 'Response'
ELSE 'Request'
END as Level
в список выбора, если вы хотите отслеживать, на каком уровне находится элемент (или вместо этого использовать цифры, если хотите)