private Parsers.DataFieldExpression parseMemberExpression(Expression expression)
        {
            Parsers.DataFieldExpression result = null;
            if (expression is MethodCallExpression)
            {
                var methodCallExpression = expression as MethodCallExpression;
                if (methodCallExpression != null)
                {
                    switch (methodCallExpression.Method.Name)
                    {
                    case "Contains":
                        result = createDataFieldExpression(Parsers.ConditionalOperator.Contains, methodCallExpression);
                        break;

                    case "StartsWith":
                        result = createDataFieldExpression(Parsers.ConditionalOperator.StartWith, methodCallExpression);
                        break;

                    case "EndWith":
                        result = createDataFieldExpression(Parsers.ConditionalOperator.EndWith, methodCallExpression);
                        break;

                    case "Match":
                        result = createDataFieldExpression(Parsers.ConditionalOperator.Match, methodCallExpression);
                        break;
                    }
                }
            }
            return(result);
        }
        private Parsers.IExpression parseBinaryExpression(Expression expression)
        {
            Parsers.IExpression result           = null;
            BinaryExpression    binaryExpression = expression as BinaryExpression;

            if (binaryExpression != null)
            {
                var nodeType = binaryExpression.NodeType;
                if (nodeType == ExpressionType.AndAlso || nodeType == ExpressionType.OrElse)
                {
                    var conditionExpression = new Parsers.ConditionalExpression();
                    conditionExpression.Left  = getExpression(binaryExpression.Left);
                    conditionExpression.Right = getExpression(binaryExpression.Right);
                    switch (nodeType)
                    {
                    case ExpressionType.AndAlso:
                        conditionExpression.Operator = Parsers.BooleanOperator.And;
                        break;

                    case ExpressionType.OrElse:
                        conditionExpression.Operator = Parsers.BooleanOperator.Or;
                        break;
                    }
                    result = conditionExpression;
                }
                else
                {
                    Parsers.DataFieldExpression fieldExpression = null;
                    switch (nodeType)
                    {
                    case ExpressionType.Equal:
                        fieldExpression = createDataFieldExpression(Parsers.ConditionalOperator.Equals, binaryExpression);
                        break;

                    case ExpressionType.NotEqual:
                        fieldExpression = createDataFieldExpression(Parsers.ConditionalOperator.NotEquals, binaryExpression);
                        break;

                    case ExpressionType.LessThan:
                        fieldExpression = createDataFieldExpression(Parsers.ConditionalOperator.Less, binaryExpression);
                        break;

                    case ExpressionType.LessThanOrEqual:
                        fieldExpression = createDataFieldExpression(Parsers.ConditionalOperator.EqualsOrLess, binaryExpression);
                        break;

                    case ExpressionType.GreaterThan:
                        fieldExpression = createDataFieldExpression(Parsers.ConditionalOperator.Greater, binaryExpression);
                        break;

                    case ExpressionType.GreaterThanOrEqual:
                        fieldExpression = createDataFieldExpression(Parsers.ConditionalOperator.EqualsOrGereater, binaryExpression);
                        break;
                    }
                    result = fieldExpression;
                }
            }
            return(result);
        }
        private Parsers.DataFieldExpression createDataFieldExpression(Parsers.ConditionalOperator @operator, MethodCallExpression expression)
        {
            var result = new Parsers.DataFieldExpression()
            {
                Operator = @operator
            };
            Type   type;
            object constant  = null;
            string fieldName = getFieldName(expression.Object, out type);

            constant             = getConstantValue(expression.Arguments.First());
            result.DataFieldType = type;
            result.DataFieldName = fieldName;
            result.Value         = constant;
            return(result);
        }
        private Parsers.DataFieldExpression createDataFieldExpression(Parsers.ConditionalOperator @operator, BinaryExpression expression)
        {
            var result = new Parsers.DataFieldExpression()
            {
                Operator = @operator
            };
            Type   type;
            object constant  = null;
            string fieldName = getFieldName(expression.Left, out type);

            if (fieldName == null)
            {
                fieldName = getFieldName(expression.Right, out type);
                constant  = getConstantValue(expression.Left);
            }
            else
            {
                constant = getConstantValue(expression.Right);
            }
            result.DataFieldType = type;
            result.DataFieldName = fieldName;
            result.Value         = constant;
            return(result);
        }
 private Parsers.DataFieldExpression createDataFieldExpression(Parsers.ConditionalOperator @operator, BinaryExpression expression)
 {
     var result = new Parsers.DataFieldExpression() { Operator = @operator };
     Type type;
     object constant = null;
     string fieldName = getFieldName(expression.Left, out type);
     if (fieldName == null)
     {
         fieldName = getFieldName(expression.Right, out type);
         constant = getConstantValue(expression.Left);
     }
     else
     {
         constant = getConstantValue(expression.Right);
     }
     result.DataFieldType = type;
     result.DataFieldName = fieldName;
     result.Value = constant;
     return result;
 }
 private Parsers.DataFieldExpression createDataFieldExpression(Parsers.ConditionalOperator @operator, MethodCallExpression expression)
 {
     var result = new Parsers.DataFieldExpression() { Operator = @operator };
     Type type;
     object constant = null;
     string fieldName = getFieldName(expression.Object, out type);
     constant = getConstantValue(expression.Arguments.First());
     result.DataFieldType = type;
     result.DataFieldName = fieldName;
     result.Value = constant;
     return result;
 }