2017-01-14 16 views
0

私は次のモデルを持っています。このモデルは、同じタイプの子でも、同じタイプの子もたくさんあります。Entity Framework - 自分自身への外部/ナビゲーションキーを持つモデルクラスへのアクセス

public class SystemGroupModel 
    { 
     public int Id { get; set; } 

     public int? ParentSystemGroupModelId { get; set; } 

     [ForeignKey("ParentSystemGroupModelId")] 
     public virtual SystemGroupModel ParentSystemGroupModel { get; set; } 

     [InverseProperty("ParentSystemGroupModel")] 
     public virtual ICollection<SystemGroupModel> SubSystemGroupModels { get; set; } 

    } 

はどのようにして、未知の深さであることIdによってSystemGroupModel特定を取得し、そのすべてが、子、孫、ひ孫などだ含めることができますか?

+0

を構築するループを含むように更新は、あなたが(熱心ロードを試してみました特定の 'SystemGroupModel'のためのhttps://msdn.microsoft.com/en-us/library/jj574232(v=vs.113).aspx)? –

+0

そのリンクの例が動作するために与えられた 'SystemGroupModel'のためにいくつのレベルの孫、曾孫などがあるか知る必要はありませんか? – amartin

答えて

0

これは動作しているように見えます。つまり、与えられた親のリストと、孫、曾孫などの無制限の子どものリストを作成します。

これは正しいアプローチですか?

まず、私はその後、私はこのコード
EDIT追加この新しいクラスに

public class SystemGroupWorkingClass 
{ 
    public SystemGroupModel SystemGroupModel { get; set; } 

    public bool WasChecked { get; set; } 
} 

を作成しました:List<SystemGroupWorkingClass>

List<SystemGroupWorkingClass> tempListSystemGroups = new List<SystemGroupWorkingClass>(); 

//Get the SystemGroups that were selected in the View via checkbox 
foreach (var systemGroupVM in viewModel.SystemGroups) 
{ 
     if (systemGroupVM.Selected == true) 
     { 
      SystemGroupModel systemGroupModel = await db.SystemGroupModels.FindAsync(systemGroupVM.Id); 

      SystemGroupWorkingClass systemGroupWorkingClass = new SystemGroupWorkingClass(); 
      systemGroupWorkingClass.SystemGroupModel = systemGroupModel; 
      systemGroupWorkingClass.WasChecked = false; 
      systemGroupWorkingClass.Selected = true; 

      //Make sure tempListSystemGroups does not already have this systemGroupWorkingClass object 
      var alreadyAddedCheck = tempListSystemGroups 
          .FirstOrDefault(s => s.SystemGroupModel.Id == systemGroupVM.Id); 

      if (alreadyAddedCheck == null) 
      { 
       tempListSystemGroups.Add(systemGroupWorkingClass); 
      } 
     } 
} 


    for (int i = 0; i < tempListSystemGroups.Count; i++) 
    { 
     if (tempListSystemGroups[i].WasChecked == false) 
     { 
      SystemGroupModel systemGroupModel2 = await db.SystemGroupModels.FindAsync(tempListSystemGroups[i].SystemGroupModel.Id); 

      //Get the children, if there are any, for the current parent 
      var subSystemGroupModels = systemGroupModel2.SubSystemGroupModels 
        .ToList(); 

      //Loop through the children and add to tempListSystemGroups 
      //The children are added to tempListSystemGroups as it is being iterated over 
      foreach (var subSystemGroupModel in subSystemGroupModels) 
      { 
       SystemGroupModel newSystemGroupModel = await db.SystemGroupModels.FindAsync(subSystemGroupModel.Id); 

       SystemGroupWorkingClass subSystemGroupWorkingClass = new SystemGroupWorkingClass(); 
       subSystemGroupWorkingClass.SystemGroupModel = newSystemGroupModel; 
       subSystemGroupWorkingClass.WasChecked = false; 

       tempListSystemGroups.Add(subSystemGroupWorkingClass); 
      } 
     } 

     //Mark the parent as having been checked for children 
     tempListSystemGroups[i].WasChecked = true; 
    } 
関連する問題