Итак, я прочитал все вопросы Q & A здесь, касающиеся темы о том, следует ли выставлять IQueryable для остальной части вашего проекта или нет (см. здесь и здесь), и я в конечном итоге решил, что я не хочу подвергать IQueryable чему-либо, кроме моей модели. Поскольку IQueryable привязан к определенным реализациям настойчивости, мне не нравится идея запереть себя в этом. Точно так же я не уверен, насколько хорошо я отношусь к классам дальше по цепочке вызовов, изменяя фактический запрос, который не находится в репозитории.
Итак, есть ли у кого-нибудь предложения по написанию чистого и сжатого репозитория без этого? Одна из проблем, которую я вижу, - это мой репозиторий, который взорвется от множества методов для разных вещей, которые мне нужно отфильтровать из моего запроса.
Имея связку:
IEnumerable GetProductsSinceDate(DateTime date);
IEnumberable GetProductsByName(string name);
IEnumberable GetProductsByID(int ID);
Если бы я разрешал передавать IQueryable, я мог бы легко создать общий репозиторий, который выглядел бы следующим образом:
public interface IRepository<T> where T : class
{
T GetById(int id);
IQueryable<T> GetAll();
void InsertOnSubmit(T entity);
void DeleteOnSubmit(T entity);
void SubmitChanges();
}
Однако, если вы не используете IQueryable, тогда методы, подобные GetAll(), не очень практичны, так как ленивая оценка не будет проходить по линии. Я не хочу возвращать 10 000 записей, чтобы использовать только 10 из них позже.
Каков ответ здесь? В Conery MVC Storefront он создал еще один слой, называемый слоем "Сервис", который получил результаты IQueryable из репозитория и отвечал за применение различных фильтров.
Это то, что я должен делать, или что-то подобное? Восстановите мой репозиторий IQueryable, но ограничьте его доступ, спрятав его за кучей классов фильтров, таких как GetProductByName, которые возвратят конкретный тип, например IList или IEnumerable?