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