2013-02-28 1 views
0

У меня есть DbContext с этими четырех многих-ко-многим связанных лиц:комплексов проекции от многих ко многим таблиц, DbContext и рамки сущности и Linq

Classes <-> Students 
Classes <-> Assignments 
Classes <-> Contents 
Classes <-> Announcements 

Теперь мне нужен код Linq (или лучше!), который даст нам последние 3 задания, последние 3 Содержание, последние 3 объявления каждого класса, где учащийся с StudentId = X находится в этих классах.

В другой руке учащийся вошел в систему на веб-сайте, и мы хотим показать его/ее последние задания, содержание, объявления каждого класса, которые он изучает в нем.

Этот код является неправильным, но может помочь вам понять мою потребность. Также этот код требует много времени для запуска (50 мс не так много?):

Редактировать: Код был почти правильным, поэтому он был переведен, чтобы ответить, посмотрите на принятый ответ. Любые другие (лучшие, более быстрые) решения оценены.

Заранее спасибо.

+1

Разница с моим кодом заключается в том, что у вас есть только классы SelectMany. В моем коде больше 'SelectMany'. Я думаю, что ваш код лучше. Так что у вас остались проблемы? В противном случае вы можете поместить свой код в ответ на свой собственный вопрос и пометить его как принятый. –

ответ

0

на основе @Герт Арнольд рекомендации я изменил немного мой код:

  • начать запрос с учеником
  • сузить результат, изменяя выбранные свойства
db.Students.Where(st => st.StudentId.Equals(CurrentUser)).SelectMany(S => S.Classes, (S, C) => new 
{ 
    Name = C.Name, 
    Assignments = C.Assignments.Select(AS => new { AS.Id, AS.Name }).OrderByDescending(As => As.Id).Take(3), 
    Contents = C.Contents.Select(Co => new { Co.Id, Co.Title }).OrderByDescending(Co => Co.Id).Take(3), 
    Announcements = C.Announcements.Select(An => new { An.Id, An.Title }).OrderByDescending(An => An.Id).Take(3) 
}); 
0

Лучше начать запрос с учеником:

from s in db.Students 
where s.StudentId == CurrentUser 
from c in s.Classes 
from as in c.Assignments.OrderByDescending(As => As.Id).Take(3) 
from co in c.Contents.OrderByDescending(Co => Co.Id).Take(3) 
from an in c.Announcements.OrderByDescending(An => An.Id).Take(3) 
select new { <selected properties> } 

Последняя часть (отдельные свойства) имеет важное значение. Выбрав только подмножество свойств, вы сузите набор результатов из базы данных. Без этого вы создаете очень широкий и длинный результирующий набор из-за большого количества объединений в запросе (SQL).

+0

спасибо, чувак за ваш хороший совет, я жду, может быть, у кого-то есть лучший ответ (быстрее). Другой вопрос: мой новый код работает, но потребляет время (50 мс на моем ПК в качестве EntityFrameworkProfiler), возможно ли быть проблемы, если 1000 студенты в то же время просят эту страницу? Также EntityFrameworkProfiler предупреждает меня. Избегайте слишком много joins_. Любой более быстрый способ? [Ссылка] (http://hibernatingrhinos.com/products/EFProf/learn/alert/TooManyJoins). –

Смежные вопросы