ASP.NET MVC2 с Entity Framework 4 - AsEnumerable() или ToList() в репозитории?

Поэтому мне несколько раз советовали отключить ленивую загрузку при создании приложения с помощью вышеуказанных фреймворков и что ToList() заставит запросы в моем репозитории выполнить. Мне сказали, что я избегу некоторых "ловушек", с которыми я мог бы столкнуться, если бы использовал AsEnumerable().

Однако в недавнем вопросе я включил кучу ToList() s в свои примеры кода и поразил ряд людей, которые заверили меня, что IEnumerable намного лучше вернуться.

Я, по меньшей мере, полностью смущен.

Должен ли я возвращать IEnumerable в моем репозитории, а затем преобразовывать их в список в моих моделях просмотра? Должен ли я использовать ToList() прямо в моем репозитории, как раньше? Предполагаю ли я оставить отложенное исполнение включенным в первую очередь?

Джимми Рождество...

Edit: Итак, если я отключил ленивую загрузку, основываясь на более ранних советах, должен ли я снова включить ее, вернуть IEnumerable/IQueryable из моего репозитория и преобразовать коллекцию в список в моих моделях просмотра, если это необходимо?

Один из нижеприведенных ответов ассоциирует IEnumerable с нетерпеливым исполнением, в то время как у меня создалось впечатление, что только ToList() заставит немедленное выполнение запроса.

Я наткнулся на этот, этот и this, которые содержат интересную дискуссию, связанную с этим вопросом.

Ответы

Ответ 1

Вызвать ToList(), возвращая IEnumerable в ваш репозиторий, если:

  • Вы хотите контролировать набор выходных данных, предоставленный потребителю (т.е. вы не хотите, чтобы они запускали запросы на нем) и
  • Вы не против нетерпеливого исполнения.

Верните IQueryable или IEnumerable через AsEnumerable() в ваш репозиторий, если:

  • Вы не возражаете против того, чтобы ваши потребители запускали запросы по выходному набору и
  • Вы хотите отсроченное выполнение.

См. также
http://thinkbeforecoding.com/post/2009/01/19/Repositories-and-IQueryable-the-paging-case