Я действительно предпочитаю второй.
Даже я видел статьи ведущих блоггеров о мире .NET, для меня запросы в репозитории являются злом в репозитории.
Причины:
Хранилище похоже на коллекцию объектов, но хранится везде, где определена его реализация.
Репозиторий абстрагирует способ отображения данных на объект. Хранилище данных может быть любым, но бизнес полагается на хранилище для извлечения, добавления, обновления или удаления объектов домена.
Любой доступ для чтения или записи к базовому хранилищу должен управляться самим хранилищем - или любым другим базовым уровнем -.
Queryable уничтожает большинство из этих пунктов и / или причин.
Например, почему вы должны создать GetProductByName , GetProductByCode , если вы можете сделать это с помощью LINQ на IQueryable?
И Queryable плохо работает в n-уровневых сценариях, поскольку у вас не будет доступа к соединению с базой данных на другом уровне, чем тот, который возвратил отложенный набор.
Я не думаю, что «запрашиваемая» концепция и репозиторий должны быть хороши для любого дизайна программного обеспечения, потому что это говорит о том, что репозиторий бесполезен.
Queryable похож на разработку GetAll метода. Какой смысл GetAll в хранилище? Репозиторий будет извлекать все доменные объекты, а вы будете фильтровать их в бизнесе. Но ... Подождите ... Репозиторий не должен извлекать доменные объекты по некоторым критериям, не так ли?
Хотя я нахожу, что queryable несовместим с репозиторием, разработка и реализация некоторого метода репозитория, который принимает лямбда-выражение или любой делегат для того, чтобы дать какой-то фильтр или поведение, для меня, подойдет. Это не отложенное выполнение, это делегирование.