Chciałbym tylko dodać że nie zawsze filtrowanie po stronie kodu jest błędem projektowym.
Przypadek:
Mamy cienkiego klienta w przeglądarce lub jako apka desktopowa/mobilna. Z serwera pobieramy wstępnie odfiltrowywaną listę rekordów np. po użytkowniku do którego należą. W tym przypadku zakładamy że rekordów będzie średnio 20, a max 100 w skrajnych przypadkach. Wtedy wyświetlamy wszystkie rekordy. Ale zakładając że mamy szereg filtrów dodatkowych po jakichś stanach/datach czy nawet po kolumnach zawierających jakiś tekst, to lepiej jest filtrować już otrzymany zestaw danych niż strzelać ponownie do serwera/bazy.
Efekt ten sam, oszczędzamy liczbę zapytań a klient i tak prawdopodobnie ma więcej mocy żeby sobie odfiltrować ponownie.
Dlatego nie ma tutaj złotego środka, a warto przemyśleć zapytania dla każdego przypadku. Tym bardziej że porządne obmyślenie trwa dużo krócej niż późniejsze przeróbki.