private static bool Remove(IMdxElement mdxElement, HashSet <IMdxElement> deleteNodes)
        {
            if (deleteNodes.Contains(mdxElement))
            {
                return(true);
            }

            var result = false;

            var children = mdxElement
                           .GetChildren()
                           .ToArray();

            foreach (var child in children)
            {
                var removeFromChild = Remove(child, deleteNodes);

                if (removeFromChild)
                {
                    var mdxCollection = mdxElement as IMdxCollectionElements;

                    if (mdxCollection != null)
                    {
                        mdxCollection.RemoveChild(child);

                        removeFromChild = mdxCollection.IsEmpty();
                    }
                }

                result = removeFromChild || result;
            }

            return(result);
        }
        private static List <MdxValueElement> GetMdxValueElements(IMdxElement initWhere)
        {
            var wheres = new List <MdxValueElement>();

            if (initWhere.GetType() == typeof(MdxValueElement))
            {
                wheres.Add((MdxValueElement)initWhere);

                return(wheres);
            }

            if (initWhere.GetType() == typeof(TypedMdxElement))
            {
                var initWhereChildren = initWhere.GetChildren()
                                        .Where(el => el.GetType() == typeof(MdxValueElement))
                                        .ToArray();

                wheres.AddRange(initWhereChildren.Cast <MdxValueElement>());
            }
            return(wheres);
        }