0

我有这些记录来自我在 linq to sql 中调用的存储过程

int_PostTypeId  vcr_PostType    int_PostTypeId_fk   vcr_Slug       HLevel

  49                 c            36                    c             1

  77                 e            49                    c/e           2

  78                 f            77                   c/e/f          3

  79                 g            77                   c/e/g          3

我有这些记录。

假设在编辑int_PostTypeId 49 时我将slug更改为c1

1)现在子记录中的slug也应该改变。

77 中的 slug 将变为 c1/e 78 中的 slug 将变为 c1/e/f 79 中的 slug 将变为 c1/e/g

2) 如果我编辑记录 77 并将 slug 更改为 c/e2,则 slug 78 和 79 也应更改为 c/e2/f 和 c/e2/g。

因此,编辑记录中的 slug 将更改子 slug(如果存在)。在 linq 中最合适和最有效的方法是什么。我正在采用递归循环路径,但我认为这是非常低效的。对更一般的方法有什么想法吗?或任何其他方法。

4

1 回答 1

0

如果我对您的理解正确,那么您实际上是在更新vcr_Slug某处记录中调用的列,而不是在存储过程中构建列的值。既然您实际上使用的是存储过程,为什么不计算列的值呢?我不确定您是否使用递归公用表表达式来选择结果,但如果是,它可能采用如下形式(对您的表结构做出一些假设,当然,这可能不会,完全具有代表性):

CREATE FUNCTION dbo.GetPostTypes(@ParentTypeID int)

RETURNS TABLE

AS RETURN

(

WITH CurrentPostTypes(int_PostTypeId, vcr_PostType, int_PostTypeId_fk, vcr_Slug,
                      HLevel)
AS
(
-- Anchor member definition
    SELECT pt.int_PostTypeId, pt.vcr_PostType, pt.int_PostTypeId_fk,
           pt.vcr_Slug, 1 AS HLevel
    FROM dbo.tblPostTypes AS pt
    WHERE pt.int_PostTypeId = @ParentTypeID
    UNION ALL
-- Recursive member definition
    SELECT pt.int_PostTypeId, pt.vcr_PostType, pt.int_PostTypeId_fk,
           cpt.vcr_Slug + '/' + pt.vcr_Slug AS vcr_Slug, cpt.HLevel + 1 AS HLevel
    FROM dbo.tblPostTypes AS pt
    INNER JOIN CurrentPostTypes AS cpt
        ON pt.int_PostTypeId_fk = cpt.int_PostTypeId
)

SELECT *
FROM CurrentPostTypes

)

您会注意到在递归成员定义中,前一个值vcr_Slug以斜线和当前记录的列值作为后缀:cpt.vcr_Slug + '/' + pt.vcr_Slug AS vcr_Slug

于 2013-01-02T14:57:37.573 回答