实体框架和存储过程递归查询

时间:2020-03-05 18:00:55

标签: c# entity-framework stored-procedures recursive-query

我试图弄清楚如何使用递归存储过程和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)

我不确定的是:

  1. 是否可以使用实体框架
  2. 我将如何设计存储过程以返回所需的数据视图
  3. 我不确定如何将其集成到GenericRepository模式中
  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

0 个答案:

没有答案
相关问题