private static Expression CreateAnyAllExpression(
            Expression left,
            Expression right,
            ParameterExpression sourceParameter,
            IEnumerable <ParameterExpression> lambdaParameters,
            MethodInfo anyAllMethod)
        {
            var genericFunc = typeof(Func <,>)
                              .MakeGenericType(
                MethodProvider.GetIEnumerableImpl(left.Type).GetGenericArguments()[0],
                typeof(bool));

            var filteredParameters = new ParameterVisitor()
                                     .GetParameters(right)
                                     .Where(p => p.Name != sourceParameter.Name)
                                     .ToArray();

            if (!filteredParameters.Any())
            {
                filteredParameters = lambdaParameters.ToArray();
            }

            return(Expression.Call(
                       anyAllMethod,
                       left,
                       Expression.Lambda(genericFunc, right, filteredParameters)));
        }
Esempio n. 2
0
        private Expression GetAnyAllFunctionExpression <T>(string filter, ParameterExpression sourceParameter,
                                                           ICollection <ParameterExpression> lambdaParameters,
                                                           IFormatProvider formatProvider)
        {
            if (filter == null)
            {
                throw new ArgumentNullException("filter");
            }

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

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

            var functionTokens = filter.GetAnyAllFunctionTokens();

            if (functionTokens == null)
            {
                return(null);
            }

            var propertyExpression = GetPropertyExpression <T>(functionTokens.Left, sourceParameter, lambdaParameters);
            var leftType           = propertyExpression.Type;
            var left = CreateExpression <T>(
                functionTokens.Left,
                sourceParameter,
                lambdaParameters,
                leftType,
                formatProvider);

            // Create a new ParameterExpression from the lambda parameter and add to a collection to pass around
            var parameterName =
                functionTokens.Right.Substring(0, functionTokens.Right.IndexOf(":", System.StringComparison.Ordinal)).Trim();
            var lambdaParameter =
                Expression.Parameter(MethodProvider.GetIEnumerableImpl(leftType).GetGenericArguments()[0], parameterName);

            lambdaParameters.Add(lambdaParameter);
            var lambdaFilter =
                functionTokens.Right.Substring(functionTokens.Right.IndexOf(":", System.StringComparison.Ordinal) + 1).Trim();
            var lambdaType = GetFunctionParameterType(functionTokens.Operation) ?? left.Type;

            var isLambdaAnyAllFunction = lambdaFilter.GetAnyAllFunctionTokens() != null;
            var right = isLambdaAnyAllFunction
                    ? GetAnyAllFunctionExpression <T>(lambdaFilter, lambdaParameter, lambdaParameters, formatProvider)
                    : CreateExpression <T>(lambdaFilter, sourceParameter, lambdaParameters, lambdaType, formatProvider);

            return(left == null
               ? null
               : GetFunction(functionTokens.Operation, left, right, sourceParameter, lambdaParameters));
        }
        private Expression GetAnyAllFunctionExpression <T>(string filter, ParameterExpression sourceParameter, ICollection <ParameterExpression> lambdaParameters, IFormatProvider formatProvider)
        {
            CustomContract.Requires(filter != null);
            CustomContract.Requires(sourceParameter != null);
            CustomContract.Requires(lambdaParameters != null);

            var functionTokens = filter.GetAnyAllFunctionTokens();

            if (functionTokens == null)
            {
                return(null);
            }

            var propertyExpression = GetPropertyExpression <T>(functionTokens.Left, sourceParameter, lambdaParameters);
            var leftType           = propertyExpression.Type;
            var left = CreateExpression <T>(
                functionTokens.Left,
                sourceParameter,
                lambdaParameters,
                leftType,
                formatProvider);

            // Create a new ParameterExpression from the lambda parameter and add to a collection to pass around
            var parameterName   = functionTokens.Right.Substring(0, functionTokens.Right.IndexOf(":", StringComparison.CurrentCultureIgnoreCase)).Trim();
            var lambdaParameter =
                Expression.Parameter(MethodProvider.GetIEnumerableImpl(leftType).GetGenericArguments()[0], parameterName);

            lambdaParameters.Add(lambdaParameter);
            var lambdaFilter = functionTokens.Right.Substring(functionTokens.Right.IndexOf(":", StringComparison.CurrentCultureIgnoreCase) + 1).Trim();
            var lambdaType   = GetFunctionParameterType(functionTokens.Operation)
                               ?? (left != null ? left.Type : null);

            var isLambdaAnyAllFunction = lambdaFilter.GetAnyAllFunctionTokens() != null;
            var right = isLambdaAnyAllFunction
                                ? GetAnyAllFunctionExpression <T>(lambdaFilter, lambdaParameter, lambdaParameters, formatProvider)
                                : CreateExpression <T>(lambdaFilter, sourceParameter, lambdaParameters, lambdaType, formatProvider);

            return(left == null
                                ? null
                                : GetFunction(functionTokens.Operation, left, right, sourceParameter, lambdaParameters));
        }
Esempio n. 4
0
        private static Expression CreateAnyAllExpression(
            Expression left,
            Expression right,
            ParameterExpression sourceParameter,
            IEnumerable <ParameterExpression> lambdaParameters,
            MethodInfo anyAllMethod)
        {
            if (left == null)
            {
                throw new ArgumentNullException("left");
            }

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

            var genericFunc = typeof(Func <,>)
                              .MakeGenericType(
                MethodProvider.GetIEnumerableImpl(left.Type).GetGenericArguments()[0],
                typeof(bool));

            var filteredParameters = new ParameterVisitor()
                                     .GetParameters(right)
                                     .Where(p => p.Name != sourceParameter.Name)
                                     .ToArray();

            if (filteredParameters.Length > 0)
            {
                return(Expression.Call(
                           anyAllMethod,
                           left,
                           Expression.Lambda(genericFunc, right, filteredParameters)));
            }

            return(Expression.Call(
                       MethodProvider.GetAnyAllMethod("All", left.Type),
                       left,
                       Expression.Lambda(genericFunc, right, lambdaParameters)));
        }