2017-01-28 2 views
0

私は自己参照テーブルを持っており、テーブルからツリービューのユーザーコントロールに日付をバインドする必要があります。私は子供を得るためにBuildThree()メソッドを使用します。私の質問は、私は私のビューモデルを使用して、ルートの親に到達するまで親を得ることができる方法であるEntity Framework自己参照テーブル。ルートに達するまで親を取得する方法

マイエンティティ:

public partial class Category 
     { 

      public Category() 
      { 
       this.children = new HashSet<Category>(); 
      } 

      public int CategoryId { get; set; } 
      public string CategoryName { get; set; } 
      public Nullable<int> ParentCategoryId { get; set; } 

      public virtual ICollection<Category> children { get; set; } 
      public virtual Category Parent { get; set; } 
     } 

私の見解モデル:

public class TreeViewModel 
{ 
     public TreeViewModel() 
     { 
      this.children = new HashSet<TreeViewModel>(); 
     } 

     public int id { get; set; } 

     public string text { get; set; } 

     public virtual TreeViewModel MyParent { get; set; } 

     public virtual IEnumerable<TreeViewModel> children { get; set; } 

    } 

そして、これが私の目的で使用する方法であり、子供を得る

public IEnumerable<TreeViewModel> BuildThree(IEnumerable<Category> categories, int? parentCategoryId = null) 
    { 
     if (categories == null) 
      return null; 
     var result = categories.Select(c => new TreeViewModel() 
     {  
      id = c.CategoryId, 
      text = c.CategoryName, 

      children = BuildThree(c.children, c.CategoryId) 
     }); 
     return result; 
    } 





     Database1Entities db = new Database1Entities(); 
     var category = db.Categories.Find(id); 

     TreeViewModel vm = new TreeViewModel(); 
     vm.id = category.CategoryId; 
     vm.text = category.CategoryName; 

     vm.children = BuildThree(category.children); 
+0

parent:Category Parentを含むカテゴリクラスにプロパティを追加します。私は木構造を上げるのが好きではありません。代わりに、私は上に移動する必要はありません再帰アルゴリズムを記述します。再帰的メソッドからの戻り値として子情報を返します。 – jdweng

+0

@jdweng。ご協力いただきありがとうございます。あなたのアイデアを実装する方法を私のコードを使って忙しくしていないのであれば、どうぞよろしいですか?申し訳ありませんが、私はプログラミングに非常に新しいです。ありがとうございました – Tom

+0

なぜ親が必要ですか?親を上に移動してルートを見つける必要がないように、ルートを静的プロパティとしてTreeViewModelに保存する必要があります。 – jdweng

答えて

0

あなたが人を惹きつける方法を探しているのであれば、MyParent肖像画あなたのBuildThreeメソッドを少し変更しなければなりません。

public IEnumerable<TreeViewModel> BuildThree(IEnumerable<Category> categories, TreeViewModel parentCategory) 
    { 
     if (categories == null) 
      return null; 
     var result = new List<TreeViewModel>(); 
     foreach (var category in categories) 
     { 
      var treeViewModel = new TreeViewModel(); 
      treeViewModel.Id = category.CategoryId, 
      treeViewModel.Text = category.CategoryName, 
      treeViewModel.MyParent = parentCategory; 
      treeViewModel.Children= BuildThree(category.children,treeViewModel); 
      result.Add(treeViewModel); 
     } 
     return result; 
    }