递归应用判断是否循环引用
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
列表作为结果。这样可以避免在循环引用的情况下出现无限递归的情况,并及时处理循环引用的问题。