Entity Framework и рекурсивный запрос хранимой процедуры - PullRequest
0 голосов
/ 05 марта 2020

Я пытаюсь выяснить, как можно добиться следующего, используя рекурсивную хранимую процедуру и 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)

В чем я не уверен:

  1. Возможно ли это с помощью Entity Framework
  2. Как бы я go о разработке хранимая процедура для возврата требуемых представлений данных
  3. Я не совсем уверен, как я мог бы интегрировать это в шаблон GenericRepository
  4. Если есть лучший способ для достижения вышеуказанного

Я посмотрел в нетерпеливую загрузку, ленивую загрузку и т. д. 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
...