/// <summary>
        /// Eliminates the empty nodes (nodes that consist of only logical elements).
        /// </summary>
        /// <param name="nodes">The nodes.</param>
        /// <returns></returns>
        protected virtual FilterExpressionNodeCollection EliminateEmptyNodes(FilterExpressionNodeCollection nodes)
        {
            FilterExpressionNodeCollection expressions = new FilterExpressionNodeCollection();

            foreach (FilterExpressionNode node in nodes)
            {
                if (node.NodeType == FilterExpressionNodeType.Element ||
                    node.NodeType == FilterExpressionNodeType.MethodBlock)
                {
                    expressions.Add(node);
                }
                else
                {
                    // Only add node if it has the actual "Element's" and does not consist of only logical AND's and OR's
                    if (node.HasChildNodes)
                    {
                        FilterExpressionNodeCollection subTree = EliminateEmptyNodes(node.ChildNodes);
                        if (subTree != null && subTree.Count > 0)
                        {
                            expressions.Add(node);
                        }
                    }
                }
            }

            return(expressions);
        }
 /// <summary>
 /// Adds the expression as node.
 /// </summary>
 /// <param name="col">The col.</param>
 /// <param name="expr">The expr.</param>
 protected virtual void AddExpressionAsNode(ref FilterExpressionNodeCollection col, CodeExpression expr)
 {
     if (expr is CodeBinaryOperatorExpression)
     {
         AddExpressionAsNode(ref col, (CodeBinaryOperatorExpression)expr);
     }
     else if (expr is CodeMethodInvokeExpression)
     {
         col.Add(ConvertExpressionToNode((CodeMethodInvokeExpression)expr));
     }
 }
        /// <summary>
        /// Adds the expression as node.
        /// </summary>
        /// <param name="col">The col.</param>
        /// <param name="expr">The expr.</param>
        protected virtual void AddExpressionAsNode(ref FilterExpressionNodeCollection col, CodeBinaryOperatorExpression expr)
        {
            if (expr.Left is CodeMethodInvokeExpression)
            {
                col.Add(ConvertExpressionToNode((CodeMethodInvokeExpression)expr.Left));
            }
            else if (expr.Left is CodeBinaryOperatorExpression)
            {
                AddExpressionAsNode(ref col, expr.Left);
            }

            // Only need an operator if right is an expression
            FilterExpressionNode blockNode = null;

            if (expr.Right is CodeBinaryOperatorExpression)
            {
                if (expr.Operator == CodeBinaryOperatorType.BooleanAnd)
                {
                    blockNode = new FilterExpressionNode(FilterExpressionNodeType.AndBlock, String.Empty);
                }
                else if (expr.Operator == CodeBinaryOperatorType.BooleanOr)
                {
                    blockNode = new FilterExpressionNode(FilterExpressionNodeType.OrBlock, String.Empty);
                }

                col.Add(blockNode);
                FilterExpressionNodeCollection blockCol = new FilterExpressionNodeCollection();
                AddExpressionAsNode(ref blockCol, expr.Right);
                blockNode.ChildNodes = blockCol;
            }

            if (expr.Right is CodeMethodInvokeExpression)
            {
                col.Add(ConvertExpressionToNode((CodeMethodInvokeExpression)expr.Right));
            }
        }