Я пытаюсь выяснить, как можно добиться следующего, используя рекурсивную хранимую процедуру и Entity Framework.
Учитывая следующий набор данных:
Parent ID, Component ID, Quantity, Sequence
SET01, TABLE, 1, 1
TABLE, TLEG, 4, 1
TABLE, SCREW, 8, 2
SET01, CHAIR, 6, 2,
CHAIR, SEAT01, 1, 1,
SEAT01, COVER01, 1, 1,
SEAT01, STAPLES, 20, 2,
CHAIR, CLEG, 4, 2,
CHAIR, SCREW, 8, 3
Я считаю, что следующая модель подойдет вышеописанному (с Item, являющимся моделью, представленной столбцами идентификаторов выше):
public class Assembly
{
public Item Parent { get; set; }
public Item Component { get; set; }
public int Quantity { get; set; }
public int Order { get; set; }
}
Для генерации лежащей в основе хранимой процедуры мне нужны два представления вышеупомянутых данных, взяв " ID родителя "в качестве параметра:
Иерархическое представление, такое как:
Dining Suite
- Table (1)
-- Table Leg (4)
-- Screws (8)
- Chair (6)
-- Seat (1)
--- Seat Cover (1)
--- Staples (20)
-- Chair Leg (4)
-- Screws (8)
Но также мне бы очень понравилось плоское представление (с суммированными величинами), например this:
Dining Suite
- Table (1)
- Table Leg (4)
- Screws (16)
- Chair (6)
- Seat (1)
- Seat Cover (1)
- Staples (20)
- Chair Leg(4)
В чем я не уверен:
- Возможно ли это с помощью Entity Framework
- Как бы я go о разработке хранимая процедура для возврата требуемых представлений данных
- Я не совсем уверен, как я мог бы интегрировать это в шаблон GenericRepository
- Если есть лучший способ для достижения вышеуказанного
Я посмотрел в нетерпеливую загрузку, ленивую загрузку и т. д. 1047 * с вышеприведенным, однако мне нужно будет загрузить все дерево (которое может быть много-много-много уровней) и показать его одним глотком. Причина, по которой я спрашиваю о хранимых процедурах, заключается в том, что я считаю, что выигрыш в производительности будет значительным по сравнению с методами на основе кода.
Я был бы очень признателен за указатели в правильном направлении.
ОБНОВЛЕНИЕ
Итак, я вроде как продвигаюсь в этом:
WITH Assembly_Tree AS (
-- Select the parent
SELECT Assy.ParentId, Assy.ComponentId, Part.Name, 0 AS OrderLevel
FROM Assemblies AS Assy
INNER JOIN Parts AS Part
ON Assy.ComponentId = Part.Id
WHERE Assy.ParentId = @parentId
UNION ALL
SELECT Assy.ParentId, Assy.ComponentId, Part.Name, OrderLevel + 1
FROM Assemblies AS Assy
INNER JOIN Parts AS Part
ON Assy.ComponentId = Part.Id
INNER JOIN Assembly_Tree AS Tree
ON Tree.ComponentId = Assy.ParentId
)
SELECT * FROM Assembly_Tree
Если я запускаю вышеупомянутый SP с @parentId = 1
, то Я получаю следующий вывод:
ParentId, ComponentId, Name, Order Level
1 3 Table 1 0
1 9 Chair 1 0
9 10 Chair Seat 1 1
9 6 Leg 1
10 13 Seat Cover 1 2
3 6 Leg 1
Принимая во внимание, что я хотел бы, чтобы вывод был в следующем порядке:
ParentId, ComponentId, Name, Order Level
1 3 Table 1 0
3 6 Leg 1
1 9 Chair 1 0
9 10 Chair Seat 1 1
10 13 Seat Cover 1 2
9 6 Leg 1