0

それ自体にリレーションを持つカテゴリ テーブルがあります。つまり、ツリー階層ビューです。たとえば、oldfather_category -> Father_category -> child_category です。

カテゴリ エンティティ

したがって、このテーブルにツリー ビューを作成する必要があります。そこからすべての行が必要です。最初に私はこれを行います:

    IEnumerable<Category> list = _service.Get().Where(c => c.ParentID == null);
    Node(list);

次のように再帰を使用すると:

    private void Node(IEnumerable<Category> list)
    {
        foreach (Category c in list)
        {
            //if has childs
            if (c.Category1.Count > 0)
                Node(c.Category1);
        }
    }

c.Category1.Countプロパティ (Deferred Execution マジック)を呼び出すたびに、エンティティ フレームワーク ビルドが選択されます。しかし、最初のステートメントですべてのエンティティをロードしたいので、SQL Server だけを選択したいのです。どうやってやるの?質問が明確であることを願っています)

編集: ToList() を使用すると、Category1 プロパティは何でも null になります

4

1 に答える 1

0

すべての子をループする関数を db サーバーに記述せずに、ツリー内のすべての要素をロードすることはできません。

ただし、実行する必要がある実際のクエリによっては、機能するものをハックできる場合があります。特定の要素が常にツリーのルートになる場合は、各要素の 3 番目の参照をツリーのルートに追加してから、メモリ内に実際のツリーを構築できます。たとえば、ブログのコメントの場合、ブログの投稿 ID は常にツリーのルートであり、各コメントには応答先の親があります。各要素とクエリにルート識別子を追加してから、メモリ内にツリーを再帰的に構築します。

クエリのルートが必ずしも事前定義されたタイプの要素であるとは限らない場合は、サーバーがこの状況を処理する関数を作成することをお勧めします。ただし、このクエリにエンティティ フレームワークを使用することはできなくなります。

于 2013-02-15T14:59:42.253 に答える