Ciao Giacomo
mi permetto di intromettermi nella discussione tra te e Davide per condividere con voi quella che è stata la mia soluzione ad un problema similare.
Trovandomi anch'io di fronte a query che restituivano migliaia di risultati da visualizzare in base a filtri impostati dall'utente, ho ritenuto opportuno adottare la strategia che va sotto il nome di "Paginazione lato server". Innanzi tutto, dal principio ho deciso che il Data Layer dell'applicazione dovesse risiedere nel server, realizzato tramite Stored Procedure (già compilate, quindi più performanti). Di conseguenza, nelle query che restituivano gli item da paginare nell'applicativo Web ho introdotto una serie di parametri che servivano a limitare gli item restituiti in base alla pagina richiesta dall'utente tramite il client. In particolare, ho usato questi parametri:
- itemsPerPage: numero massimo di item che il client può visualizzare in una pagina. Se il recordset calcolato dalla SP ha un numero di item maggiore di itemPerPage, la SP restituirà solo una pagina contenente un numero di item pari a itemPerPage (personalmente, ho dichiarato la variabile itemPerPage globalmente)
- startItem: l'indice del primo item che la SP dovrà restituire. Quando, per esempio, l'utente visiterà la seconda pagina degli item da lui precedentemente filtrati, e supponendo che itemsPerPage sia 10, la SP avrà in ingresso un valore di startItem pari a 11, e dunque dovrà restituire gli item che vanno dall'11-mo al 20-mo (qui trovi come realizzare la paginazione in T-SQL con o senza CTE)
In questo modo, a prescindere dal filtro utilizzato dall'utente, la SP restituirà sempre un numero di item pari a itemsPerPage. Inoltre, il numero di pagine totale dei dati richiesti dall'utente ( Math.Ceiling(itemsTotalNum / itemsPerPage) ), variabile a seconda dei filtri impostati e necessario per generare sul client i link alle pagine da visitare (page navigator), verrà memorizzato nella sessione corrente, in modo da non eseguire più di una volta la query che lo calcola, ottimizzando così le prestazioni.
Nel Business Layer si utilizzerà il numero di pagina da visualizzare scelto dall'utente e il numero di item per pagina, in modo da calcolare lo startItem che servirà alla SP. Infatti, dato il numero di pagina da visualizzare (pageNum) e il numero di item per pagina (itemsPerPage) si ha che:
startItem = (pageNum - 1) * itemsPerPage
valore che possiamo a questo punto passare alla nostra SP 
Non so se si tratta della soluzione migliore, è semplicemente un'alternativa alla soluzione da te intrapresa.
Ciao!