背景:公司項目要實現兼容 MS SQL、Oracle、PgSQL、DM 等多種數據庫,由於各種數據庫對遞歸實現方式不盡相同,如果每種數據庫都寫一種 SQL 語句來實現,未免太多,且需求是不定的,哪天又加一種數據庫,會很大的增加代碼的維護成本。因此爲了更好的同時兼容多種數據庫,我們可以用代碼代替 SQL 語句來實現遞歸查詢。
實現:
List<string> parentOrg = new List<string>();
/// <summary>
/// 遞歸查詢父級ID
/// </summary>
/// <param name="id"></param>
/// <param name="list"></param>
/// <returns></returns>
private string GetParents(string id, List<dynamic> list)
{
parentOrg.Add(id);
List<dynamic> result = list.Where(x => x.ID == id).ToList();
if (result.Count > 0 && result[0].ParentID != null && result[0].ParentID.ToString() != "")
return GetParents(result[0].ParentID, list);
else
return id;
}
public static class Main(string[] args)
{
string id = '3'; //當前節點id
List<dynamic> listAll; //result是符合包含當前節點在內的所有節點的列表
GetParents(id, listAll);
List<dynamic> result = parentOrg; //得到的result就是當前節點+當前節點的所有父級
}