public IEnumerable <string> GetExpand()
        {
            string rec(OdataSelectExpand c)
            {
                var parts = new List <string>();

                var select = c.GetSelect();

                if (c.Filter != null)
                {
                    parts.Add($"$filter={c.Filter}");
                }
                if (select.Any())
                {
                    parts.Add($"$select={string.Join(",", select)}");
                }
                var sem = c.SelectMembers.Where(x => x.IsComplexType).Select(x => x.MemberPath);

                if (c.Childs.Any() || sem.Any())
                {
                    parts.Add($"$expand={string.Join(",", sem.Concat(c.Childs.Select(x => rec(x))))}");
                }
                var se = string.Join(";", parts);

                return($"{c.MemberPath}({se})");
            }

            return(SelectMembers.Where(x => x.IsComplexType).Select(x => x.MemberPath).Concat(Childs.Select(x => rec(x))));
        }
 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);
             }
         }
     }
 }
 public IEnumerable <string> GetSelect()
 {
     return(SelectMembers.Where(x => !Childs.Any(y => y.MemberPath == x.MemberPath) && !x.IsComplexType).Select(x => x.MemberPath));
 }