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