- var data = await _IDBInstance.DBOperation.QueryAsync
(sql); -
- //向上查询引用公式
- List
GetSonNode(long id, List 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
(); - }
- 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
(); - foreach (var item in formulaRecIdList)
- {
- result.AddRange(GetSonNode(item, data.ToList()));
- }
代码中通过判断 path 列表是否包含当前的 id 来判断是否出现循环引用。如果 path 中已经包含了当前的 id,则表示在查询过程中出现了循环引用,会记录错误日志,并返回一个空的 FormulaReference 列表作为结果。这样可以避免在循环引用的情况下出现无限递归的情况,并及时处理循环引用的问题。