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