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の編集中にスラッグc1に変更したとします。

1) 子レコードのスラッグも変更する必要があります。

77 のスラッグは c1/e になります 78 のスラッグは c1/e/f になります 79 のスラッグは c1/e/g になります

2) レコード 77 を編集してスラッグを c/e2 に変更すると、スラッグ 78 と 79 も c/e2/f と c/e2/g に変更する必要があります。

そのため、レコード内のスラッグを編集すると、子スラッグが存在する場合は変更されます。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 に答える