Мне также не нравится возвращать объектный запрос, потому что это сделает вас очень зависимым от Entity Framwork. Зная Microsoft, они, вероятно, внесли много изменений в версию 2, поэтому вы не хотите этого делать.
NHibernate использует критерии, как вы и предлагали, но их реализация гораздо более общая. Мне нравится более общая реализация, чем ваш пример, потому что тогда вам не нужно создавать критерии для каждого объекта. С другой стороны, ваша реализация типизирована, что тоже очень аккуратно. Если вы хотите получить лучшее из обоих, более общую реализацию, которая является типизированной, вы можете взглянуть на реализацию NHibernate, но вместо использования строк используйте лямбда-функции и обобщенные .Net. Я мог бы опубликовать пример, как это сделать, но сейчас я не на своей машине.