protected override Expression VisitMethodCall(MethodCallExpression node)
        {
            IReadOnlyList <Expression> arguments;

            if (node.Method.Name == nameof(Enumerable.Select))
            {
                arguments = new Expression[] { base.Visit(node.Arguments[0]), node.Arguments[1] }
            }
            ;
            else
            {
                arguments = base.Visit(node.Arguments);
            }

            Expression expression = base.Visit(node.Object);

            if (expression == node.Object && arguments == node.Arguments)
            {
                return(node);
            }

            MethodInfo closeMethod = OeMethodInfoHelper.MakeGenericMethod(node.Method, arguments);

            return(Expression.Call(node.Object, closeMethod, arguments));
        }