public OdataSelectExpand GetCleanTree() { var newTree = new OdataSelectExpand(); OdataSelectExpand seekTree(IEnumerable <SelectMember> path, OdataSelectExpand old = null) { var n = newTree; foreach (var p in path) { var c = n.Childs.FirstOrDefault(x => x.MemberPath == p.MemberPath); if (c == null) { c = new OdataSelectExpand { MemberPath = p.MemberPath, IsComplexType = true, Filter = old?.Filter }; n.Childs.Add(c); } n = c; } return(n); } void recCreate(OdataSelectExpand current, IEnumerable <SelectMember> path) { var currentPath = path; var n = seekTree(path, current); foreach (var m in current.SelectMembers) { var p = m.Split(); var cp = path.Concat(p.Take(p.Length - 1)); if (!currentPath.SequenceEqual(cp)) { currentPath = cp; n = seekTree(cp); } var mp = p.Last(); if (!n.SelectMembers.Any(x => x.MemberPath == mp.MemberPath)) { n.SelectMembers.Add(mp); } } foreach (var child in current.Childs) { recCreate(child, path.Concat(child.Split())); } } recCreate(this, Enumerable.Empty <SelectMember>()); return(newTree); }
public void Merge(OdataSelectExpand tree) { if (tree.MemberPath == MemberPath) { SelectMembers = SelectMembers.Concat(tree.SelectMembers).Distinct().ToList(); foreach (var child in tree.Childs) { var selfChild = Childs.FirstOrDefault(x => x.MemberPath == child.MemberPath); if (selfChild != null) { selfChild.Merge(child); } else { selfChild.Childs.Add(child); } } } }