You've been given plenty of good ideas already, but I want to talk about how you think about design, especially as it relates to the data model.
1) you can already see that some datasources don't support delegation at all. This mean you either always have less than 2000 records in the back end AND you updated the default delegation from 500 to 2000.
2) validate that you aren't creating unnecessarily large mutli-complex filters. Sure its easy to just keep Anding or ||ing them together and it works, but does working for you mean its closer to optimal, or simply that it grabs the correct data.
Most people are the later. They just want the query to run and give data and be done.
3) What exactly is your data, Transactional? Analytical? Business process mixture? etc.
How you build your data model, impacts the app more than anything else because sometimes it makes sense to normalize it all and other times to denormalize it, and do you purposely duplicate data, use lookups, references etc etc.
in most instances, people are only thinking about make it work, not making it (as a pattern) optimal.
4) did you remember to turn on delegation support for certain back end datasources and functions(expressions).
In the end, we will almost always be able to tell you how to get rid of the delegation issue, but the real question is, is the data model really what it should be, versus 2 off fixes (which sometimes... won't come easy)
Cheers,