E' sufficiente che tu esegua il metodo ToList() applicandolo a una espressione LINQ che sia meno restrittiva di quella finale, cioè che includa tutti gli elementi validi per i filtri che applicherai, ma che non sia troppo "larga" da caricare in memoria dal DB una quantità esagerata di dati.

Nel tuo caso, potresti individuare la data minima del filtro e la data massima, filtrando i record con quei limiti.

Quando esegui ToList(), l'espressione viene valutata, la query sul DB eseguita e ti vengono restituiti degli oggetti.

Puoi applicare le successive espressioni LINQ agli oggetti ottenuti, poiché in quel caso starai utilizzando LINQ 2 Objects e quindi non andrai a eseguire nuove query sul DB, ma filtrerai direttamente gli oggetti in memoria.

Ciao!