EF (и LINQ в этом отношении) используют отложенное выполнение. Вы можете довольно легко создать динамический запрос, используя IQueryable (время поиска Google?) И создав критерии фильтрации в объекте, который вы строите (вы можете сделать это без объекта, но думаете, что его можно использовать повторно).
Что касается SQL sproc, вы также можете решить его, передав все элементы, которые могут изменить фильтр, и заставить SQL динамически работать с данными для получения результирующего набора.
Какой выбрать? Это действительно зависит от того, где находится основная компетенция в вашей группе. Я предпочитаю код C # в основном из-за фамильярности (потратил годы, занимаясь sprocs, но динамические sprocs могут быть настоящей болью).
Теперь одна вещь, о которой вы хотите опасаться, - это динамические запросы, которые не могут быть легко настроены сервером (например, статистика в SQL Server, хотя другие РСУБД используют аналогичные концепции). Например, одна проблема, с которой я столкнулся при работе с LINQ to SQL, - это динамические запросы, которые приводят к тому, что SQL выполняет неоптимально, что требует большого количества ручных операций от администратора баз данных.