来自数据表的嵌套对象
本文关键字:嵌套 对象 数据表 | 更新日期: 2023-09-27 18:06:27
我觉得我有点跑题了。我一直在用脑袋敲键盘,但我不觉得自己离解决问题有任何进展。如有指导,不胜感激。
Models.Content
包含一个类型为List<Models.Content>
的SubContent
属性。嵌套可以是无限的,并且应该是递归的。我觉得这应该可以用几行LINQ
和while
来完成。我搞得一团糟。
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();
我同意,我认为您可以用更少的代码行构建您的模型层次结构,从而使您的代码更易于维护和阅读。我实际上会分两步来做这个…
- 首先解析根"内容"(
ParentContentId == null
…我猜)…这可以用LINQ 一行代码完成 - 然后遍历所有子内容行(指定了ParentContentId的行)并将它们"附加"到父内容(如果存在)
让我知道如果你有想法或者如果你需要一个例子