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