0

私は最近奇妙な問題に遭遇しました。私はタスクという名前のデータベースにテーブルを持っています。タスクには、親タスクと複数の子タスク(自己参加)が含まれる場合があります。CTE(共通テーブル式)を使用して、プロジェクト内のすべてのタスクの子とサブ子をnレベルまで返すストアドプロシージャを作成しました。私の必要な結果は次のとおりです代替テキスト

結果は正常に達成されます。最初の列にインデントが表示され、階層関係が示されます。問題は、私がそれを「悪い方法」でやっているということです。以下は私のビューコードです

<table cellspacing="0">
    <%foreach (var it in Model.list.Where(x=>x.ParentID == null))
      {
          int x = 1;%>

        <tr>
            <td width="150"><div class="wrapper" style="width:18px;">&nbsp;</div><%:it.TOC %></td>
            <td><%:it.label %></td>
            <td><%:it.StartDate%></td>
            <td><%:it.EndDate%></td>
            <td><%:it.smallDescription %></td>
        </tr>
            <%=Model.CallRecursion(it,Model.list,ref x) %>


    <%} %>

uは、html文字列を再帰的に返すモデルでCallrecursionメソッドが定義されていることを確認できます。以下はCallRecursionメソッドのコードです。

public string CallRecursion(TempModel item, List<TempModel> all,ref int count) 
        {
            if(all.Where(x=>x.ParentID == item.ID).Count() == 0)
                return "";
            else
            {
                count++;
                string retval = "<tr>";
                foreach (var kids in all.Where(x => x.ParentID == item.ID)) 
                {
                    retval += "<td><div style='width:"+count*18+"px;' class='wrapper'>&nbsp;</div><span>" + kids.TOC + "</span></td><td>" + kids.label + "</td><td>" + kids.StartDate + "</td><td>" + kids.EndDate+"</td><td>"+kids.smallDescription+"</td></tr>"+
                        CallRecursion(kids, all,ref count);
                }
                count--;
                return retval;
            }


        }

私の質問は、どうすればこの目標をよりクリーンな方法で達成できるかということです。部分ビューを再帰的に呼び出してhtmlをレンダリングできるかどうか、もしそうなら、ダイナミクスはどうなるかわかりません。コメントや提案をいただければ幸いです。

4

1 に答える 1

1

次のように結果が得られるようにCTEを変更して、各行がツリーのどのレベルであるかを指定してみませんか。このように、SQLはすでに再帰呼び出しを行っているので、アプリケーションコードでこれをやり直すのはなぜですか。

このようにして、メソッドを単純化して、TreeLevelをピクセル数で乗算するだけで、正しいインデントを得ることができます。再帰の必要はありません。結果のモデルをループするだけです。

Numberいずれにせよ、「すべてのルートノードの概要を教えてください」のような他のことを実行して1、2、3に等しい行になる可能性があるため、各アイテムをTreeLevelにすることの価値は高くなると思います。

TreeLevel Number  Other_data
0         1       ...
1         1.1     ...
1         1.2     ...
2         1.2.1   ...
2         1.2.1   ...
0         2       ...
1         2.1     ...
1         2.2     ...
2         2.1.2   ... 
3         2.1.2.1 ...
0         3       ...

CTEに関しては、4guysfromrollaのこの記事を参照してください。この記事では、CTE結果セットの一部として階層(TreeLevel)値を含める方法を示しています。

元のコードに関するその他の注意事項-コードからHTMLを作成する場合は、TagBuilderクラスを使用してください。IMO、それははるかにクリーンでより良いでしょう。マジックストリングの構築はありません。

于 2010-10-22T07:07:24.433 に答える