2016-04-19 3 views
2

J'essaie de parcourir plusieurs tables relancées avec SQLite-Net Extensions. Mais ça n'a pas marché. Qu'est-ce que je fais mal?Comment parcourir plusieurs tables relancées avec des extensions SQLite-Net?

foreach (var topTableItem in Database.GetAllWithChildren<TopTable>()) 
     { 
      foreach (var middleTableItem in topTableItem.MiddleTableList) 
      { 
       System.Diagnostics.Debug.WriteLine(middleTableItem.Id); // The same database entry as in the working code (see below) 

       System.Diagnostics.Debug.WriteLine(middleTableItem.BottomTableList.Count); // Always return 0 
       foreach (var bottomTableItem in middleTableItem.BottomTableList) 
       { 
        System.Diagnostics.Debug.Write("It works"); // Never reached, because middleTableItem.BottomTableList.Count == 0 
       } 
      } 
     } 

Avec "MiddleTable" comme point d'entrée, cela fonctionne:

foreach (var middleTableItem in Database.GetAllWithChildren<MiddleTable>()) 
     { 
      System.Diagnostics.Debug.WriteLine(middleTableItem.Id); // The same database entry as in the not working example (see above) 

      System.Diagnostics.Debug.WriteLine(middleTableItem.BottomTableList.Count); // Return > 0 
      foreach (var bottomTableItem in middleTableItem.BottomTableList) 
      { 
       System.Diagnostics.Debug.Write("It works"); // Reached! 
      } 
     } 

TopTable, avec la liste des articles MiddleTable:

public class TopTable 
{ 
    [PrimaryKey, AutoIncrement] 
    public int Id { get; set; } 

    public string Test { get; set; } = "Test"; 

    [OneToMany(CascadeOperations = CascadeOperation.All)] 
    public List<MiddleTable> MiddleTableList{ get; set; } = new List<MiddleTable>(); 
} 

MiddleTable, avec la liste des articles BottomTable:

public class MiddleTable 
{ 
    [PrimaryKey, AutoIncrement] 
    public int Id { get; set; } 

    public string Test { get; set; } = "Test"; 

    [OneToMany(CascadeOperations = CascadeOperation.All)] 
    public List<BottomTable> BottomTableList { get; set; } = new List<BottomTable>(); 

    [ForeignKey(typeof(TopTable))] 
    public int TopTableId{ get; set; } 

    [ManyToOne(CascadeOperations = CascadeOperation.All)] 
    public TopTable TopTable{ get; set; } = null; 
} 

BottomTable:

public class BottomTable 
{ 
    [PrimaryKey, AutoIncrement] 
    public int Id { get; set; } 

    public string Test { get; set; } = "Test"; 

    [ForeignKey(typeof(MiddleTable))] 
    public int MiddleTableId { get; set; } 

    [ManyToOne(CascadeOperations = CascadeOperation.All)] 
    public MiddleTable MiddleTable { get; set; } 
} 

Avant les boucles, j'insérer les objets:

List<BottomTable> TheList { get; set; } = new List<BottomTable>(); 

     var bottomTableObj = new BottomTable { Test = "ok" }; 
     Database.Insert(bottomTableObj); 

     TheList.Add(bottomTableObj); 

     var middleTableObj = new MiddleTable { Test = "ok", BottomTableList = TheList.ToList() }; 
     Database.Insert(middleTableObj); 

     var middleTableListTemp = new List<MiddleTable>(); 
     middleTableListTemp.Add(middleTableObj); 

     var topTableObj = new TopTable {Test = "ok", MiddleLableList = middleTableList.Temp.ToList()}; 
     Database.Insert(topTableObj); 

     Database.UpdateWithChildren(topTableObj); 

Répondre

0

Utilisation GetAllWithChildren vous ne chargez le premier niveau des relations.

paramétrez la recursive à true:

var topTableItems = Database.GetAllWithChildren<TopTable>(recursive: true) 
foreach (var topTableItem in topTableItems) { 

Ou chercher les enfants manuellement dans la boucle for:

foreach (var topTableItem in Database.GetAllWithChildren<TopTable>()) 
{ 
    foreach (var middleTableItem in topTableItem.MiddleTableList) 
    { 
     System.Diagnostics.Debug.WriteLine(middleTableItem.Id); // The same database entry as in the working code (see below) 

     // Fetch MiddleTable children    
     conn.GetChildren(middleTableItem); 

     System.Diagnostics.Debug.WriteLine(middleTableItem.BottomTableList.Count); // Always return 0 
     foreach (var bottomTableItem in middleTableItem.BottomTableList) 
     { 
      System.Diagnostics.Debug.Write("It works"); 
     } 
    } 
}