我目前在SQL表中有数据,其中包含ConfigHead表和Config Line Table。 Config Line表是一个自引用表。我的新数据结构有ConfigLines,它有一组ConfigLines,我试图递归遍历记录并将子ConfigLines添加到父ConfigLines集合。这就是我现在拥有的......
这是数据结构
ConfigHead
ConfigLine
正如您所看到的,ConfigLine表具有引用自身的ParentConfigLineId。如果ParentConfigLineId为0,那么这意味着它是一个顶级项目。
以下是我正在尝试获取数据的数据模型的形状。
public class ConfigLine
{
public int Id { get; set; }
public int ConfigHeadId { get; set; }
public int ParentCongigLineId { get; set; }
public List<ConfigLine> Children { get; set; }
}
public class ConfigHeader
{
public int Id { get; set; }
public List<ConfigLine> ConfigLines { get; set; }
}
目前我正试图以递归方式遍历Config Lines,但我不确定如何将其添加到父列表中。这就是我到目前为止所做的。
public void Get(int id)
{
//Main ConfigHeader Record
var configHeader = new ConfigHead();
//Get the record from the db
var configRecord = _configRepository
.GetAll()
.Include(p => p.ConfigLines)
.Where(x => x.Id == id).FirstOrDefault();
//Loop the top level config lines
foreach (var configLine in configRecord.ConfigLines.Where(x => x.ParentConfigLineId == 0))
{
if (configLine.ParentConfigLineId == 0)
{
//Add the Top Level Config line
var topLevel = new ConfigLine
{
Id = configLine.Id,
ConfigHeadId = configLine.ConfigHeadId,
ParentCongigLineId = configLine.ParentConfigLineId
};
configHeader.children.Add(topLevel);
//Check the top level ConfigLine to see if it has any children.
var topLevelConfigLines = configRecord.ConfigLines
.Where(x => x.ParentConfigLineId == configLine.Id)
.ToList();
if (topLevelConfigLines.Any())
{
AddChildConfigLine(configRecord, configLine);
}
}
}
}
这是我的递归方法 - 我一直坚持如何走下集合,然后将它们添加到父项目中。
private void AddChildConfigLine(ConfigRecord configRecord,
ConfigLine configLine)
{
//Check for any child records
var childConfigLines = configRecord.ConfigLines.Where(x => x.ParentConfigLineId == configLine.Id);
foreach (var childConfigLine in childConfigLines)
{
//How to add to the collection?
AddChildConfigLine(configRecord, childConfigLine);
}
}