Зачем использовать AsQueryable () вместо List ()?
Я начинаю использовать шаблон репозитория для доступа к данным с помощью Entity Framework и LINQ как основа реализации Нетестового репозитория. В большинстве примеров я вижу return AsQueryable () когда вызов возвращает N записей вместо List. В чем преимущество этого?
4 ответов:
AsQueryable просто создает запрос, инструкции, необходимые для получения списка. Вы можете внести дальнейшие изменения в запрос позже, например, добавить новые предложения Where, которые отправляются вплоть до уровня базы данных.
AsList возвращает список всех элементов в памяти. Если вы добавите к нему новый ключ Where cluse, вы не получите быструю фильтрацию, которую предоставляет база данных. Вместо этого вы получите всю информацию в списке, а затем отфильтровать то, что вам не нужно в приложение.
Так что в основном это сводится к ожиданию до последнего возможного момента, прежде чем совершить себя.
возвращение
IQueryable<T>имеет то преимущество, что выполнение является defferer, пока вы действительно не начнете перечислять результат, и вы можете составить запрос с другими запросами и все равно получить выполнение на стороне сервера.проблема в том, что вы не можете контролировать время жизни контекста базы данных в этом методе - вам нужен открытый контекст и должен гарантировать, что он остается открытым до тех пор, пока запрос не будет выполнен. И тогда вы должны убедиться, что контекст будет уничтожен. Если вы вернете результат как
List<T>,T[], или что-то подобное, вы теряете отложенные исполнением и исполнением сервер запросов, но вы выиграете контроль над жизни контекста базы данных.то, что подходит лучше всего, конечно, зависит от фактических требований. Это еще один вопрос без единой истине.
AsQueryableметод расширения дляIEnumerable<T>что может сделать две вещи:
- если
IEnumerable<T>осуществляетIQueryable<T>просто бросает, ничего не делая.- в противном случае создает 'поддельные'
IEnumerable<T>(EnumerableQuery<T>), который реализует каждый метод, компилирующий лямбды и вызывающий перечисляемые методы расширения.поэтому в большинстве случаев использование AsQueryable бесполезно, если только u не вынужден передавать IQueryable методу, а u имеет IEnumerable вместо этого, это хак.
Примечание: AsQueryable это хак, IQueryable конечно нет!
возвращение
IQueryable<T>отложит выполнение запроса до тех пор, пока его результаты не будут фактически использованы. До тех пор вы также можете выполнять дополнительные операции запроса базы данных наIQueryable<T>; наListвы ограничены обычно менее эффективными операциями в памяти.
Comments