/// <summary>
        /// Initializes a new instance of the <see cref="FilterExpressionFactory"/> class.
        /// </summary>
        /// <param name="memberNameResolver">An <see cref="IMemberNameResolver"/> for name resolution.</param>
        /// <param name="expressionFactories">The custom <see cref="IValueExpressionFactory"/> to use for value conversion.</param>
        public FilterExpressionFactory(IMemberNameResolver memberNameResolver, IEnumerable <IValueExpressionFactory> expressionFactories)
        {
            CustomContract.Requires <ArgumentNullException>(memberNameResolver != null);
            CustomContract.Requires <ArgumentNullException>(expressionFactories != null);

            _valueReader        = new ParameterValueReader(expressionFactories);
            _memberNameResolver = memberNameResolver;
        }
        public void CanConvertValidFilterValue(string token, Type type)
        {
            var reader = new ParameterValueReader(Enumerable.Empty <IValueExpressionFactory>());

            Assert.DoesNotThrow(() => reader.Read(type, token, CultureInfo.CurrentCulture));
        }
Esempio n. 3
0
        private Expression CreateExpression <T>(string filter, ParameterExpression sourceParameter,
                                                ICollection <ParameterExpression> lambdaParameters, Type type,
                                                IFormatProvider formatProvider)
        {
            if (filter == null)
            {
                throw new ArgumentNullException("filter");
            }

            if (sourceParameter == null)
            {
                throw new ArgumentNullException("sourceParameter");
            }

            if (lambdaParameters == null)
            {
                throw new ArgumentNullException("lambdaParameters");
            }

            if (filter.IsNullOrWhiteSpace())
            {
                return(null);
            }

            var tokens = filter.GetTokens();

            if (tokens.Any())
            {
                return(GetTokenExpression <T>(sourceParameter, lambdaParameters, type, formatProvider, tokens));
            }

            if (string.Equals(filter, "null", StringComparison.OrdinalIgnoreCase))
            {
                return(Expression.Constant(null));
            }

            var stringMatch = StringRx.Match(filter);

            if (stringMatch.Success)
            {
                return(Expression.Constant(stringMatch.Groups[1].Value, typeof(string)));
            }

            if (NegateRx.IsMatch(filter))
            {
                var negateExpression = CreateExpression <T>(
                    filter.Substring(1),
                    sourceParameter,
                    lambdaParameters,
                    type,
                    formatProvider);

                if (SupportsNegate(negateExpression.Type))
                {
                    return(Expression.Negate(negateExpression));
                }

                throw new InvalidOperationException("Cannot negate " + negateExpression);
            }

            var expression = GetAnyAllFunctionExpression <T>(filter, sourceParameter, lambdaParameters, formatProvider)
                             ?? GetPropertyExpression <T>(filter, sourceParameter, lambdaParameters)
                             ?? GetArithmeticExpression <T>(filter, sourceParameter, lambdaParameters, type, formatProvider)
                             ?? GetFunctionExpression <T>(filter, sourceParameter, lambdaParameters, type, formatProvider);

            if (expression == null)
            {
                if (type != null)
                {
                    expression = ParameterValueReader.Read(type, filter, formatProvider);
                }
                else
                {
                    var booleanExpression = ParameterValueReader.Read(typeof(bool), filter, formatProvider) as ConstantExpression;
                    if (booleanExpression != null && booleanExpression.Value != null)
                    {
                        expression = booleanExpression;
                    }
                }
            }

            if (expression == null)
            {
                throw new InvalidOperationException("Could not create expression from: " + filter);
            }

            return(expression);
        }
 /// <summary>
 /// Initializes a new instance of the <see cref="FilterExpressionFactory"/> class.
 /// </summary>
 /// <param name="memberNameResolver">An <see cref="IMemberNameResolver"/> for name resolution.</param>
 /// <param name="expressionFactories">The custom <see cref="IValueExpressionFactory"/> to use for value conversion.</param>
 public FilterExpressionFactory(IMemberNameResolver memberNameResolver, IEnumerable <IValueExpressionFactory> expressionFactories)
 {
     _valueReader        = new ParameterValueReader(expressionFactories);
     _memberNameResolver = memberNameResolver;
 }