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);
             }
         }
     }
 }