来自数据表的嵌套对象

本文关键字:嵌套 对象 数据表 | 更新日期: 2023-09-27 18:06:27

我觉得我有点跑题了。我一直在用脑袋敲键盘,但我不觉得自己离解决问题有任何进展。如有指导,不胜感激。

Models.Content包含一个类型为List<Models.Content>SubContent属性。嵌套可以是无限的,并且应该是递归的。我觉得这应该可以用几行LINQwhile来完成。我搞得一团糟。

private static List<Models.Content> GetAllContentFromDataSet(DataSet ds)
{
    var content = new List<Models.Content>();
    var contentList = (from DataRow row in ds.Tables[0].Rows
                       select new Models.Content
                       {
                           Id = Convert.ToInt32(row["Id"]),
                           ParentContentId = Convert.ToInt32(row["ParentContentId"]),
                           c3 = Convert.ToString(row["c3"]),
                           c4 = Convert.ToString(row["c4"]),
                           c5 = Convert.ToString(row["c5"])
                       }).ToList();
    content.AddRange(NestContent(contentList));
    return content;
}
private static IEnumerable<Models.Content> NestContent(List<Models.Content> content)
{
    var toBeRemoved = new List<Models.Content>();
    foreach (var c in content)
    {
        var parent = content.FirstOrDefault(p => p.Id == c.ParentContentId);
        if (parent == null) continue;
        parent.SubContent.Add(c);
        toBeRemoved.Add(c);
    }
    foreach (var c in toBeRemoved)
    {
        content.Remove(c);
    }
    return content;
}

来自数据表的嵌套对象

下面是我要做的一个例子:

// Create a list of all items without children.
var things = table.AsEnumerable()
                  .Select(row => new Thing
                  {
                      Id = row.Field<int>("Id"),
                      ParentId = row.Field<int>("ParentId")
                  })
                  .ToList();
// Add children to each item.
things.ForEach(t1 => t1.Children = things.Where(t2 => t2.ParentId == t1.Id).ToList());
// Create a list of items that don't have a parent..
things = things.Where(t => t.ParentId == 0).ToList();

我同意,我认为您可以用更少的代码行构建您的模型层次结构,从而使您的代码更易于维护和阅读。我实际上会分两步来做这个…

  1. 首先解析根"内容"(ParentContentId == null…我猜)…这可以用LINQ
  2. 一行代码完成
  3. 然后遍历所有子内容行(指定了ParentContentId的行)并将它们"附加"到父内容(如果存在)

让我知道如果你有想法或者如果你需要一个例子