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