5

私は動的データ サイト (非常に強力) に取り掛かり、それを楽しんでいます。しかし、私には満たすことができないように見える要件があります。自己結合されたカテゴリ テーブル (Id、Name、ParentId) を使用して、階層カテゴリ構造を作成しています (たとえば、null id を持つカテゴリはトップ レベルであり、通常のものです)。次に、カテゴリへの外部キーを持つ製品テーブルがあります。

動的データ サイト内で、カテゴリ ドロップダウン リストが自動的に生成されます。ただし、すべてのカテゴリを番号順にリストするだけです。私が望むもの (および以前にコード化した動的データ以前) は、インデントされたリストであり、階層的に配置されたカテゴリのリストです。

既存の FilterUserControl を置き換える必要がありますか? PopulateListControl メソッドをどこでもオーバーライドできますか? 自己結合された階層データを抽出するための LINQ 構文を持っている人はいますか?

ポインタとアドバイスだけで十分です。提供された助けに感謝します。

敬具、

マイク・キングスコット

4

2 に答える 2

2

SQLServerには階層データ型があります。使ったことはありませんが、面白そうです。 http://msdn.microsoft.com/en-us/magazine/cc794278.aspx

このような状況で私がよく使うのは、左右の木です。これらは、データのクエリに効率的です。最も重要なのは、ツリーをロードして永続化するための特定のレイヤーがあることです。これにより、データベースからすべての子が取得され、ツリーがメモリにロードされます。レイヤーは、ツリー内のノードの移動、ノードの削除なども担当します。ツリーをメモリに整理したら、そこからすべてを実行できます。お役に立てば幸いです。一般的な左/右ツリーのコードサンプルが必要な場合はお知らせください。

于 2009-11-20T23:20:13.493 に答える
2

Oracleの場合:

SELECT  LEVEL, Id, Name, LPAD(' ', LEVEL) || Name AS IndentedName
FROM    Categories
START WITH
        ParentID IS NULL
CONNECT BY
        ParentID = PRIOR Id
ORDER SIBLINGS BY
        Name

疑似列IndentedNameに基づいてカスタムフォーマットを使用または作成できます(各カテゴリの深さを示します)LEVEL

PSインデックスを使用してアクセスすることはできないため、最上位の親IDとして使用することをお勧めしますbad。代わりにNULL使用してください。0

アップデート:

SQL Server

WITH    q (id, parentid, name, level, bc) AS
        (
        SELECT  id, parentid, name, 1, CAST(ROW_NUMBER() OVER (ORDER BY name) AS VARCHAR(MAX))
        FROM    Categories
        WHERE   ParentID IS NULL
        UNION ALL
        SELECT  c.id, c.parentid, c.name, q.level + 1, q.bc + '.' + CAST(ROW_NUMBER() OVER (ORDER BY c.name) AS VARCHAR(MAX))
        FROM    q
        JOIN    Categories c
        ON      c.parentId = q.id
        )
SELECT  *
FROM    q
ORDER BY
        bc

とは異なりOracle、値にSQL Serverインデックスを付けるため、を使用して最終的な祖先をマークすることができます。NULLNULL

于 2009-01-30T14:54:46.080 に答える