Я бачив багато проектів, у яких є сховища, які повертають екземпляри IQueryable. Це дозволяє додаткові фільтри та сортування можна виконувати IQueryableза іншим кодом, що перекладається на різні генеровані SQL. Мені цікаво, звідки взялася ця закономірність і чи це гарна ідея.
Моя найбільша стурбованість - IQueryableце обіцянка потрапити в базу даних через деякий час, коли вона буде перерахована. Це означає, що помилка буде викинута за межі сховища. Це може означати, що виняток Entity Framework викидається в інший рівень програми.
У минулому я також стикався з проблемами з декількома наборами активних результатів (MARS) (особливо при використанні транзакцій), і такий підхід звучить так, що це призведе до того, що це трапляється частіше.
Я завжди дзвонив AsEnumerableабо ToArrayв кінці кожного з моїх виразів LINQ, щоб переконатися, що база даних потрапила, перш ніж залишати код сховища.
Мені цікаво, чи повернення IQueryableможе бути корисним як будівельний блок для рівня даних. Я бачив якийсь досить екстравагантний код з одного сховища, що викликає інше сховище, щоб створити ще більше IQueryable.
whereпропозицію до відкладеного IQueryable, вам потрібно буде надіслати ці дані лише через провід, а не весь набір результатів.