Как я могу поддерживать отложенное выполнение с EF при проецировании в другой тип? - PullRequest
1 голос
/ 13 января 2010

Я использую EF 4, и мне нужно найти способ сохранить отложенное выполнение и проецировать в другой тип.

Это мой существующий код:

AppointmentRepository appointmentRepository = new AppointmentRepository();
var appointmentGridItems = from a in appointmentRepository.ListAppointments()
                           select new AppointmentGridItemViewModel(a);   

Этот код генерирует следующее исключение времени выполнения:

"В LINQ to Entities поддерживаются только беспараметрические конструкторы и инициализаторы."

Есть ли другой способ сформировать оператор linq для достижения того, что я хочу?

Контекст проблемы (если какая-либо проблема или у нее есть запрет): мне нужно, чтобы мой список встреч сериализовался как JSON, однако сериализация EF ObjectSet приводит к ошибке циклической ссылки в JSON. Я получаю, что результат из моего репозитория должен быть отложенным, потому что компонент сетки, который я использую (из средств управления Telerik ASP.NET MVC), требует его, чтобы управление страницей данных в БД осуществлялось вместо представления.

Спасибо.

1 Ответ

0 голосов
/ 13 января 2010
var appointmentGridItems = from a in appointmentRepository.ListAppointments().AsEnumerable()
                           select new AppointmentGridItemViewModel(a);  

... сделаю это. Да, это все еще отложено. ToArray или ToList не будет отложено; AsEnumerable есть.

Если вы можете сделать что-то вроде:

var appointmentGridItems = from a in appointmentRepository.ListAppointments()
                           select new AppointmentGridItemViewModel
                           {
                               Appointment = a
                           };  

Тогда вы можете сделать это полностью в L2E. Смотрите этот пост для большего количества примеров. L2E поддерживает проекции POCO (даже в EF 1); для этого нужен просто конструктор без параметров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...