Зачем использовать AsQueryable () вместо List ()?

Я использую шаблон хранилища для доступа к данным с помощью Entity Framework и LINQ в качестве основы реализации нетестового репозитория. Большинство образцов, которые я вижу, возвращают AsQueryable (), когда вызов возвращает N записей вместо List . В чем преимущество этого?

AsQueryable просто создает запрос, инструкции, необходимые для получения списка. Вы можете внести дальнейшие изменения в запрос позже, например добавить новые предложения Where, которые будут отправлены до уровня базы данных.

AsList возвращает фактический список со всеми элементами памяти. Если вы добавите к нему новое предложение Where, вы не получите быструю фильтрацию базы данных. Вместо этого вы получаете всю информацию в списке, а затем отфильтровываете то, что вам не нужно в приложении.

Поэтому в основном это сводится к ожиданию до последнего возможного момента, прежде чем совершить себя.

Возrotation IQueryable имеет то преимущество, что выполнение деффер, пока вы действительно не начнете перечислять результат, и вы можете составить запрос с другими запросами и все равно выполнить выполнение на стороне сервера.

Проблема заключается в том, что вы не можете контролировать время жизни контекста базы данных в этом методе – вам нужен открытый контекст и должен убедиться, что он остается открытым до тех пор, пока запрос не будет выполнен. И тогда вы должны убедиться, что контекст будет удален. Если вы вернете результат в виде List , T[] или чего-то подобного, вы потеряете исполнение и выполнение на стороне сервера составленных запросов, но вы получите контроль над временем жизни контекста базы данных.

То, что подходит лучше всего, конечно, зависит от реальных требований. Это другой вопрос без единой истины.

AsQueryable – это метод расширения для IEnumerable который может выполнять две функции:

  • Если IEnumerable реализует выполнение IQueryable , то ничего не делает.
  • В противном случае создается «поддельный» IEnumerable ( EnumerableQuery ), который реализует каждый метод компиляции lambdas и вызов методов Enumerable extension.

Поэтому в большинстве случаев использование AsQueryable бесполезно, если только вы не вынуждены передавать IQueryable методу, и вместо этого у вас есть IEnumerable, это взломать.

ПРИМЕЧАНИЕ. AsQueryable – это взлом, IQueryable, конечно же, нет!

Возврат IQueryable отсрочит выполнение запроса до тех пор, пока его результаты не будут использованы. До тех пор вы также можете выполнять дополнительные операции с базами данных на IQueryable ; в List вы ограничены, как правило, менее эффективными операциями в памяти.

Давайте будем гением компьютера.