2009-06-08 7 views
0

テーブルに隣接モデルが適用されている(ID、ParentID)場合、どのように階層をSubsonic 3で返すことができますか?Subsonic 3と隣接モデル

答えて

2

すべてのクラスは部分的なものなので、クラスの新しい部分を作成して(カテゴリと言う)、子コレクションを作成します(SubCategoriesと呼ぶ)。オブジェクトをメモリにロードすると、サブコレクションを読み込むことができます。

var allCategories=Categories.All().ToList(); 
allCategories.ForEach(x=>x.SubCategories=allCategories.Where(y=>y.CategoryID==x.ParentID)); 

これはフリーハンドですが、それが理念です。

+0

私の質問に関するアイデアは私のポストで概説されていますか? – Jon

+0

私は別のクラスを作成し、別のメソッドを介して "構造化された"ビットにアクセスすることを言及したいと思います - 多分SubSonicコアメソッドを呼び出す代わりに "GetItemHierarchy"のようなもの。 –

+0

GetItemHeirarchyというメソッドを作成しても、私はまだその内部にコードを置くだけです。すべてのレコードを返す必要があるため、Childrenコレクションを生成するためにCore All()メソッドを使用する際の問題は何ですか? – Jon

1

私はこれを常に使用しています。すべての行を読むだけです。それはあなたが後で行で行うことです。私は、ツリーを表示するためにIDとParentIDを自動的に選ぶDevExpressツリーコントロールにそれらを送ります。または、数行の再帰を使用して、ツリーをたどり、好きなことをすることができます。

var result = from _db.Products select p;

1

これは私がRobに感謝していますが、再帰関数がまだ必要かどうか疑問です。 LINQの代替品はありますか?

 var allCategories = Table_1.All().ToList(); 
     allCategories.ForEach(x => x.Children = allCategories.Where(y => y.ParentID == x.ID)); 

     var topLevel = allCategories.Where(f => f.ParentID == 0); 

     s.AppendLine("<ul>"); 
     DoStuff(topLevel); 
     s.AppendLine("</ul>"); 

     private void DoStuff(IEnumerable<Table_1> toplevel) 
     { 
      foreach (var lve in toplevel) 
      { 
      s.AppendLine("<li>"+lve.Title); 
      if (lve.Children.Count() > 0) 
      { 
       s.AppendLine("<ul>"); 
       DoStuff(lve.Children); 
       s.AppendLine("</ul>"); 
      } 
      s.AppendLine("</li>"); 
      } 
     } 
+0

これについて新しい質問を作成することをお勧めします。おそらくもっと回答が得られます –

+0

機能やSPを使用する場合は、SQL Serverでこれを行うことができます: http://blog.wekeroad.com/ブログ/呪われた再帰 - 再帰的な結合を照会する/ –

+0

私は私の解決策に固執すると思います – Jon