cs
var data = await _IDBInstance.DBOperation.QueryAsync<FormulaReference>(sql);
//向上查询引用公式
List<FormulaReference> GetSonNode(long id, List<FormulaReference> nodeList, List<long> path = null)
{
if (path == null)
{
path = new List<long>();
}
if (path.Contains(id))
{
var formulaReferences = nodeList.Where(x => x.RefFormulaRecId == id);
_logger.Error("出现循环引用:" + id + "_数据:" + JsonConvert.SerializeObject(formulaReferences), null);
// 出现循环引用,抛出异常或返回空列表等
return new List<FormulaReference>();
}
path.Add(id);
var query = nodeList.Where(c => c.RefFormulaRecId == id);
var result = query.Concat(query.SelectMany(t => GetSonNode(t.FormulaRecId, nodeList, path))).ToList();
path.Remove(id);
return result;
}
var result = new List<FormulaReference>();
foreach (var item in formulaRecIdList)
{
result.AddRange(GetSonNode(item, data.ToList()));
}
代码中通过判断 path
列表是否包含当前的 id
来判断是否出现循环引用。如果 path
中已经包含了当前的 id
,则表示在查询过程中出现了循环引用,会记录错误日志,并返回一个空的 FormulaReference
列表作为结果。这样可以避免在循环引用的情况下出现无限递归的情况,并及时处理循环引用的问题。