При упаковке Query сохраняется информация об объекте AOT, на основе которого он был создан.
Когда происходит вызов new QueryRun(Query), для Query вызывается метод Init(), который перетирает ранее восстановленный из контейнера range.
Варианта решения два - в Init() проверять range и инициализировать только если value() пустой.
Либо, не пересоздвать QueryRun, а заменять в нем Query
X++:
if(this.isInBatch())
queryRun.query(unPackedQuery);