Мне нравится, когда это возможно, придерживаться интерфейса IQueryable, единственная проблема в том, что в итоге вы выполняете сложную фильтрацию или повторно запрашиваете по требованию на уровне контроллера, если у вас есть что-то вроде:
//DATA ACCESS
public IQueryable<T> GetStudents()
{
return db.Students;
}
И в вашем контроллере вы делаете некоторую повторную резкость, потому что ваш клиент хочет отфильтровать некоторые данные этого результата, наверняка у вас будет соблазн сделать это на уровне контроллера:
var result = obj.GetStudents().Where(d=>d...);
и для меня это нормально, но просто представьте, если какой-то другой модуль должен использовать тот же фильтр, вы не можете вызвать его, потому что он находится на уровне контроллера.
Так что для меня это баланс между СУХОЙ, гибкостью и масштабируемостью системы.
Если вам нужна полностью масштабируемая система, вам нужно будет выполнить несколько или несколько перегрузок для метода GetStudents () и избавиться от повторной резкости на уровне контроллера.