Получение древовидной структуры от базы данных с помощью LINQ

Мне сохранили древовидную структуру организационной схемы в базе данных. Что-то как

ID (int);
Name (String);
ParentID (int)

В C# это представлено классом как

class Employee
{
int ID, 
string Name, 
IList < Employee> Subs
} 

Я задаюсь вопросом, как лучший способ состоит в том, чтобы получить эти значения от базы данных для заполнения Объектов C# с помощью LINQ (я использую Платформу Объекта),

Должно быть что-то лучше, чем звонок, чтобы заставить верхний уровень, затем выполняющий повторенные вызовы получать нижние индексы и так далее.

Как лучше всего сделать это?

7
задан Craig Stuntz 6 January 2010 в 20:01
поделиться

5 ответов

[

]Я бы добавил поле к сущности для включения родительского идентификатора, а затем вытащил бы всю таблицу в память, оставив подраздел List нулевым. Затем пропустил бы итерацию по объектам и заполнил бы список, используя linq к объектам. Только один запрос к БД должен быть обоснован.[

].
1
ответ дан 7 December 2019 в 10:02
поделиться
[

]Запрос структуры сущностей должен позволять включать связанные наборы сущностей, хотя и в унарном соотношении, но не уверен, как это будет работать...[

] [

]Проверьте это для получения более подробной информации: []http://msdn.microsoft.com/en-us/library/bb896272.aspx[][

]
0
ответ дан 7 December 2019 в 10:02
поделиться
[
    ] [
  1. ] Можно построить хранимый proc, который встроен в рекурсию. Посмотрите на []http://msdn.microsoft.com/en-us/library/ms190766.aspx[] для получения более подробной информации об общих выражениях таблицы в SQL Server[
  2. ] [
  3. ]Возможно, вы захотите найти другой (лучший?) способ моделирования ваших данных. []http://www.sqlteam.com/article/more-trees-hierarchies-in-sql[] перечисляет популярный способ моделирования иерархических данных в базе данных. Изменение моделирования может позволить вам создавать запросы, которые могут быть выражены без рекурсии.[
  4. ] [
]
3
ответ дан 7 December 2019 в 10:02
поделиться
[

] Ну... даже с LINQ вам понадобится два запроса, потому что любой одиночный запрос будет дублировать главного сотрудника и таким образом приведет к созданию нескольких сотрудников (которые на самом деле являются одними и теми же).... Однако, это можно немного скрыть с помощью linq, когда вы создаете объект, то есть когда вы будете выполнять второй запрос, что-то вроде этого:[

] [
var v = from u in TblUsers
        select new {
            SupervisorName = u.DisplayName,
            Subs = (from sub in TblUsers where sub.SupervisorID.Value==u.UserID select sub.DisplayName).ToList()
        };
]
0
ответ дан 7 December 2019 в 10:02
поделиться

Если Вы используете SQL Server 2008, Вы можете воспользоваться новой функцией HIERARCHYID.

Организации в прошлом боролись с изображением дерева как структуры в базах данных, много соединяет в себе множество сложных логических элементов место, будь то организация иерархия или определение спецификации (BOM) (Bill of Материалы), где один готовый продукт зависит от другого полуфабриката материалы/комплекты и эти комплекты предметы зависят от другого полуфабриката готовые изделия или сырьевые материалы.

SQL Server 2008 имеет решение для проблема в том, что мы храним весь иерархия типа данных Иерархия. HierarchyID - это переменная тип данных системы длины. HierarchyID используется для определения местоположения в иерархия такого элемента, как Скотт генеральный директор и Марк, а также Рави докладывает Скотту, Бену и Лоре. отчитываться перед Марком, Виджеем, Джеймсом и Фрэнком. доложите Рави.

Поэтому используйте новые доступные функции и просто возвращайте необходимые данные без использования LINQ. Недостатком является то, что вам придется использовать UDF или хранимые процедуры для чего угодно, кроме простого корневого запроса:

SELECT @Manager = CAST('/1/' AS hierarchyid)         
SELECT @FirstChild = @Manager.GetDescendant(NULL,NULL)  
2
ответ дан 7 December 2019 в 10:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: