我试图弄清楚如何使用递归存储过程和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是上面ID列所代表的模型):
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)
但是我也很想要一个展平的视图(具有合计的数量),例如:
Dining Suite
- Table (1)
- Table Leg (4)
- Screws (16)
- Chair (6)
- Seat (1)
- Seat Cover (1)
- Staples (20)
- Chair Leg(4)
我不确定的是:
我已经通过上面的内容研究了急切的加载,延迟加载等,但是,我将需要加载整棵树(可能有很多很多层次)并显示在一个大口上。我之所以询问存储过程的原因,是因为我认为与基于代码的方法相比,性能收益将是重要的。
我非常感谢朝着正确方向的指针。
更新
所以,我正在这方面取得进展:
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
如果我使用@parentId = 1
运行上述SP,则会得到以下输出:
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