Вы действительно хотите взять выражение в качестве аргумента этого метода.
Что касается производительности, то все зависит от того, насколько далеко вы хотите пойти с ней. Самый простой способ - перенести все объекты в память, а затем выполнить фильтрацию с помощью выражения предиката.
С другой стороны, вы упоминаете какие-то критерии. Я понятия не имею, какова ваша внутренняя система данных, но вы можете взять эти пропущенные фильтры и преобразовать их в ваши критерии. Это в основном то, что делают Linq to SQL и Linq to Entities, но, надеюсь, диапазон возможностей, которые вам нужно поддерживать, значительно меньше. Если нет, возможно, имеет смысл переключиться на один из инструментов ORM, если вы хотите использовать этот подход.