/// <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)); }
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; }