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