Привет всем!
Я новичок в EF. Помогите пожалуйста найти решение для работы с иерархиями с нефиксированной глубиной в EF. Имеется иерархическая таблица:
CREATE TABLE [dbo].[Department](
[DepartmentID] [int] IDENTITY(1,1) NOT NULL,
[OrganizationID] [int] NULL,
[Name] [nvarchar](50),
[ShortName] [nvarchar](50) NULL,
[ParentID] [int] NULL,
CONSTRAINT [PK_Department] PRIMARY KEY CLUSTERED
(
[DepartmentID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
ALTER TABLE [dbo].[Department] WITH CHECK ADD CONSTRAINT [FK_Department_Department] FOREIGN KEY([ParentID])
REFERENCES [dbo].[Department] ([DepartmentID])
ALTER TABLE [dbo].[Department] WITH CHECK ADD CONSTRAINT [FK_Department_Organization] FOREIGN KEY([OrganizationID])
REFERENCES [dbo].[Organization] ([OrganizationID])
При вызове метода
using (someEntities app = new someEntities())
{
List<Department> departments = someEntities.Departments.ToList();
}
получаю List<Department> с приблизительно такой древовидной структурой:
+ Department 1 (First level) parent == null
++ Department 4 (Second level) parent == Department 1
+++ Department 6 (Third level) parent == Department 4
+ Department 4 (Second level) parent == Department 1
++ Department 6 (Third level) parent == Department 4
+ Department 2 (First level) parent == null
++ Department 5 (Second level) parent == Department 2
+ Department 3 (First level) parent == null
+ Department 5 (Second level) parent == Department 2
+ Department 6 (Third level) parent == Department 4
Полужирным курсивом выделены избыточные данные, дублирующиеся как на самом верхнем уровне, так и в качестве детей соответсвующих родителей. Ясно, что в цикле можно удалить из списка все элементы, находящиеся на верхнем уровне, у которых parent != null вместе со всеми их детьми. Также ясно, как можно получить правильное дерево, если известна глубина иерархии, напр.,
using (someEntities app = new someEntities())
{
List<Department> departments = (someEntities.Departments
.Include("Children.Children")
.Where(e => e.Parent == null)).ToList();
}
Вопрос заключается в том, как получить сразу правильное дерево для иерархии с нефиксированной (заранее неизвестной) глубиной?