【问题标题】:How to iterate throught multiple releated tables with SQLite-Net Extensions?如何使用 SQLite-Net 扩展遍历多个相关表?
【发布时间】:2016-04-19 17:42:50
【问题描述】:

我正在尝试使用 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
                }
            }
        }

以“MiddleTable”为入口点,它可以工作:

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,带有 MiddleTable Items 的列表:

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,带有底部表项的列表:

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;
}

底表:

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; }
}

在循环之前我插入对象:

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);

【问题讨论】:

    标签: c# sqlite sqlite-net sqlite-net-extensions


    【解决方案1】:

    使用GetAllWithChildren 您只加载第一级关系。

    尝试将recursive 标志设置为true

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

    或者在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");
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-06
      • 1970-01-01
      • 2012-01-15
      • 2020-09-22
      • 1970-01-01
      • 2011-01-28
      • 2015-06-17
      • 1970-01-01
      相关资源
      最近更新 更多