Beispiel #1
0
            public IQueryable <TElement> CreateQuery <TElement>(Expression expression)
            {
                if (expression.NodeType == ExpressionType.Call)
                {
                    MethodCallExpression callExpression = (MethodCallExpression)expression;


                    if (callExpression.Method.Name == "Select" &&
                        callExpression.Method.GetParameters().Length == 2 &&
                        callExpression.Method.GetParameters()[0].ParameterType == typeof(IQueryable <T>) &&
                        callExpression.Method.GetParameters()[1].ParameterType == typeof(Expression <Func <T, TElement> >))
                    {
                        Expression <Func <T, TElement> > selector = ((UnaryExpression)callExpression.Arguments[1]).Operand as Expression <Func <T, TElement> >;

                        return(new SelectQueryable <TElement, T>(
                                   Expression.Lambda <Func <IQueryable <T> > >(callExpression.Arguments[0]).Compile()(),
                                   selector.Compile()));
                    }


                    if (typeof(T) != typeof(TElement))
                    {
                        throw new ApplicationException("Queryable and ObjectProviderType does not match.");
                    }


                    Expression[] arguments = new Expression[callExpression.Arguments.Count];

                    bool replaced = false;
                    for (int i = 0; i < callExpression.Arguments.Count; i++)
                    {
                        if (i == 0 && typeof(IQueryable).IsAssignableFrom(callExpression.Arguments[0].Type))
                        {
                            arguments[0] = callExpression.Arguments[0];
                        }
                        else
                        {
                            arguments[i] = ExpressionHelper.ReplaceExpressionParts(callExpression.Arguments[i],
                                                                                   x => x.NodeType == ExpressionType.Constant ||
                                                                                   ExpressionHelper.ContainsAny(x, y => y.NodeType == ExpressionType.Parameter) ?
                                                                                   x :
                                                                                   Expression.Constant(LambdaExpression.Lambda(x).Compile().DynamicInvoke(), x.Type));
                        }

                        replaced = replaced || arguments[i] != callExpression.Arguments[i];
                    }

                    if (replaced)
                    {
                        expression = LambdaExpression.Call(callExpression.Object, callExpression.Method, arguments);
                    }
                }

                return((IQueryable <TElement>)Queryable.Create(_objectProvider, expression));
            }
        public void ContainsAny(Expression <Func <string, string> > expression, Predicate <Expression> predicate, bool expectedValue)
        {
            bool result = ExpressionHelper.ContainsAny(expression, predicate);

            Assert.Equal(expectedValue, result);
        }