static private MultiNode BuildMulti(BinaryExpression be, BaseNode parent, bool negate)
        {
            var result = new MultiNode();

            result.Not  = negate;
            result.Mode = be.NodeType == ExpressionType.AndAlso ? MultiNode.Operator.All : MultiNode.Operator.Any;
            if ((parent as MultiNode)?.Mode == result.Mode)
            {
                (parent as MultiNode).AddNode(BuildFromExpression(be.Left, parent));
                (parent as MultiNode).AddNode(BuildFromExpression(be.Right, parent));
                return(null);
            }
            else
            {
                result.AddNode(BuildFromExpression(be.Left, result));
                result.AddNode(BuildFromExpression(be.Right, result));
            }

            return(result);
        }
        /// <summary>
        /// Injects a new MultiNode into the tree, in place of the current node, and makes the current node a child of the MultiNode.
        /// </summary>
        /// <returns>The injected MultiNode</returns>
        public MultiNode PromoteToMulti()
        {
            var multi = new MultiNode();

            if (Parent != null)
            {
                var i = Parent.Children.IndexOf(this);
                Parent.Children.Remove(this);
                Parent.AddNode(multi, i);
            }
            multi.AddNode(this);

            return(multi);
        }