forumuser - the 'secret' is to ONLY create objects for the data that you want to display. so for example in the posts entity and bll, depending on the 'page size' of the UI view, you will only typically ever query and return 10 rows (if this is what you defined at your max view rows on the posts). using the:
string SQLString = "SELECT TOP(@End) * FROM ("
+ string.Format("SELECT *, ROW_NUMBER() OVER (ORDER BY {0}) AS RowNum FROM tbh_Posts",
sortExpression != "" ? sortExpression : "PostID ASC")
+ ") AS Alltbh_Posts WHERE RowNum BETWEEN @Start AND @End ORDER BY RowNum ASC";
syntax (in SQLServer) ensures that you only ever query the rows that you require to display. likewise, in the BLL a key is setup on the cache for this particular set of data. in a search routine, it'd work in exactly the same way, so if you returned 2000 rows in the search, you'd only ever populate 10 objects (or whatever your max view row size was) and repopulate when the pager was clicked.
i hope i haven't assumed too much knowledge in this area. again, this is the 'golden' area of asp.net (efficient paging) and if used correctly, a database with millions of rows can be queried and return instantly. but, it's important to understand the paging stuff for this to work correctly. from reading your question above i 'think' you possibly haven't appreciated the power of the ROW_NUMBER combination for efficiently processing huge data volumes (apoligies if you have of course :)).
hope this clears things a bit. if not, step thro' the code of the little example (with tbh_posts) that i put up for you yesterday and hopefully you'll experience a 'eureka' moment...
jimi
http://www.originaltalent.com