Список запросов LINQ в списке

У меня такая ситуация:

Мой вид модели:

public class Subject
{
   public int ID { get; set; }
   public string Name { get; set; }
   public int ProfessorID { get; set; }
   public string ProfessorFullName{ get; set; }
   public IList<Assistant> Assistants { get; set; }
}

public class Assistant
{
   public string AssistantFullName{ get; set; }
}

Мой запрос:

var subjects = from subject in Entities.Subjects
                            from professor in subject.Lecturers
                            where professor.Professor == true
                            select new SSVN.ModelView.Subject()
                            {
                                ID = subject.ID,
                                Name= subject.Name,
                                ProfessorFullName= professor.LastName+ " " + professor.Name,
                                Assistants= (from subject1 in Entities.Subjects
                                            from assistant in subject1.Lecturers
                                            where assistant.Professor == false
                                            select new SSVN.ModelView.Assistant()
                                            {
                                                AssistantFullName = assistant.LastName+ " " + assistant.Name
                                            }).ToList()
                            };

И когда я звоню:

subjects.ToList(); Я получаю исключение:

LINQ to Entities does not recognize the method
'System.Collections.Generic.List`1[SSVN.ModelView.Assistant] ToList[Assistant]
(System.Collections.Generic.IEnumerable`1[SSVN.ModelView.Assistant])' method, and this 
method cannot be translated into a store expression.

person Vajda    schedule 02.06.2011    source источник
comment
Ваш класс и запрос не совпадают.   -  person Henk Holterman    schedule 02.06.2011


Ответы (2)


Вы не можете вызывать ToList внутри запроса linq-to-entities. Запрос Linq-to-entities всегда будет проецироваться на IEnumerable<T>, поэтому, если вы хотите IList<T>, вы должны вызывать его в linq-to-objects.

Попробуй это:

var subjects = (from subject in Entities.Subjects
                from professor in subject.Lecturers
                where professor.Professor == true
                select new 
                    {
                        ID = subject.ID,
                        Name= subject.Name,
                        ProfessorFullName= professor.LastName+ " " + professor.Name,
                        Assistants= (from subject1 in Entities.Subjects
                                     from assistant in subject1.Lecturers
                                     where assistant.Professor == false
                                     select new SSVN.ModelView.Assistant()
                                         {
                                             AssistantFullName = assistant.LastName+ " " + assistant.Name
                                         })
                    }).AsEnumerable().Select(x => new SSVN.ModelView.Subject
                         {
                            ID = x.ID,
                            Name = x.Name,
                            ProfessorFullName = X.ProffesorFullName,
                            Assistants = x.Assistants.ToList()
                         });
person Ladislav Mrnka    schedule 02.06.2011
comment
Assistants= (из subject1 в Entities.Subjects от помощника в subject1.Lecturers, где Assistant.Professor == false выберите новый SSVN.ModelView.Assistant() {AssistantFullName = Assistant.LastName+ + Assistant.Name}) У меня здесь проблема, так как Assistants являются IList, и этот запрос делает IQueryablle - person Vajda; 02.06.2011
comment
Нет. Вы не будете проецировать свое представление модели в части linq-to-entities. Вместо этого вы будете использовать анонимный тип, а проекция на представление вашей модели с преобразованием в IList произойдет в части linq-to-object. - person Ladislav Mrnka; 02.06.2011
comment
Мне удалось сделать свойство Assistants IQueryable, а затем в моем представлении я просто вызываю метод .ToList(). Таким образом, это работает. :) Спасибо Ладислав - person Vajda; 02.06.2011
comment
Вы правы, я не видел, чтобы вы удалили тип из верхнего выбора. :) - person Vajda; 02.06.2011

Вы не можете и не должны использовать ToList() в запросе IQueryablle. Обратите внимание, что этот запрос должен быть переведен в SQL.

person Henk Holterman    schedule 02.06.2011