LINQ to Entity Framework многие ко многим со списком строк - PullRequest
0 голосов
/ 30 мая 2011

Этот вопрос является продолжением: Не могу вспомнить запрос, который решает это много ко многим

Этот запрос LINQ рекомендован мне пользователем @juharr, я только что добавил конкатенацию строкс целью группировки имени и фамилии в полное имя.

var courseViews = from c in db.Courses  
                  select new CourseView()  
                  {  
                      CourseID = c.ID,  
                      ProfessorName = (from l in c.Leturers   
                                       where l.Is_Professor   
                                       select l.LastName+" "+l.FirstName).FirstOrDefault(),  
                      AssistantNames = (from l in c.Leturers   
                                        where !l.Is_Professor   
                                        select l.LastName+" "+l.FirstName)
                                        .ToList()   //hmmm problem
                  };

ModelView, который я использовал, является еще одной возможной причиной проблем:

public class CourseView
    {
        public int ID { get; set; }
        public string CourseName { get; set; }
        public string ProfessorName { get; set; }
        public List AssistantNames { get; set; }
    }

Хмм. Список строк для имен помощников проблематичен, не так ли?В конце моей глупости, в View я перебрал этот список с помощью @foreach(var s in item.AssistantNames){@s}
@ Ладислав предложил использовать IQueryable вместо строки, как где?

Для решения, которое я принял до сих пор, я получаю следующее error :

LINQ to Entities не распознает метод 'System.Collections.Generic.List 1[System.String] ToList[String](System.Collections.Generic.IEnumerable 1 [System.String]) ', и этот метод нельзя преобразовать в выражение хранилища.

Нужна помощь!

Ответы [ 3 ]

1 голос
/ 30 мая 2011

Отбросьте вызов ToList(), а затем измените свойство Assistants на следующее:

public IQueryable AssistantNames { get; set; }
0 голосов
/ 30 мая 2011

Другой подход заключается в том, что, поскольку вы все равно материализуете все курсы, чтобы разделить запрос на две части, первая материализует данные, вторая использует их для создания представлений курса (теперь это запрос Linq to Objects):

var courses = (from c in db.Courses 
               select new { c.ID, Leturers = c.Leturers.ToList() }).ToList();

var courseViews = from c in courses 
                  select new CourseView()  
                  {  
                      CourseID = c.ID,  
                      ProfessorName = (from l in c.Leturers   
                                       where l.Is_Professor   
                                       select l.LastName+" "+l.FirstName).FirstOrDefault(),  
                      AssistantNames = (from l in c.Leturers   
                                        where !l.Is_Professor   
                                        select l.LastName+" "+l.FirstName)
                                        .ToList()  
                  };
0 голосов
/ 30 мая 2011

Посмотрите, работает ли это

var courseViews = from c in db.Courses
                  let assistantsList =  (from l in c.Leturers   
                                        where !l.Is_Professor   
                                        select l.LastName+" "+l.FirstName).ToList()   
                  select new CourseView()  
                  {  
                      CourseID = c.ID,  
                      ProfessorName = (from l in c.Leturers   
                                       where l.Is_Professor   
                                       select l.LastName+" "+l.FirstName).FirstOrDefault(),  
                      AssistantNames =  assistantsList
                  };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...