Actualmente la solución más eficiente que he encontrado que funcionará con cualquier consulta SOQL a través de la API de pareja es que persistan los sObjects volvió del QueryResult inicial y el localizador de consulta en caso que se solicita una página fuera de los resultados actuales.
Esto requirió un nivel de soporte de paginación en la parte superior de Salesforce QueryResult.
I.e. Cuando se solicita una página sObjects pueden ser requeridos a partir de:
- La corriente (en caché) QueryResult
- A QueryResult posterior que puede ser exagerado usando el localizador de consulta
- A QueryResult antes
- alguna combinación de los Tres.
Si la página abarca dos (o más) QueryResults será necesario crear un QueryResult artificial con todos los registros requeridos.
actualización para la primavera 2012 Release
Parece que hay una nueva funcionalidad que viene añadir soporte OFFSET para SOQL. P.ej.
SELECT Name FROM Merchandise__c WHERE Price__c > 5.0 ORDER BY Name LIMIT 50 OFFSET 100
Ver Spring '12 Force.com Platform Release - OFFSET added to SOQL (Pilot)
actualización para el verano de 2012 Release
OFFSET is now GA (disponibilidad general?)
En el sitio Salesforce Ideas hay una discusión de utilizar el campo ID en conjunto con el ordene y limite la funcionalidad de SOQL para recorrer los resultados. Ver http://ideas.salesforce.com/article/show/10089030/SOQL_Request_allow_greaterthan_lessthan_WHERE_conditions_for_Id_fields –
Esto probablemente conduzca a un mal karma de mi parte, pero encontré una forma de hacer paginación sobre las consultas genéricas de SOQL. Compartiría el código, pero es parte de un producto comercial. Lo mejor que puedo hacer es compartir un enlace si alguien está interesado: http://www.fishofprey.com/2009/10/soql-pagination-for-salesforce-api.html. –