我有这些记录来自我的存储过程,我在linq调用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时,我将段塞更改为c1
1)现在子记录中的段塞也应该被更改。
段塞在77中将变成c1/e78段塞段变成c1/e/f79段塞流将变为c1/e/g
2)如果我编辑记录77并将段塞更改为c/e2,则段塞78和79也应更改为c/e2/f和c/e2/g。
因此,编辑记录中的段信息将改变子段信息(如果存在的话)。在linq中做这件事最合适和有效的方法是什么?我用的是递归循环路径,但我觉得效率很低。有什么更一般的方法吗?
如果我理解正确的话,您实际上是在某个地方更新记录中名为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