2016-07-11 3 views
-1

У меня есть два объекта Session и Student и объект объединения StudentSessions.Загрузка связанных данных в одном большом отношении

Теперь у меня есть экран профиля, который должен запрашивать все данные выбранного студента.

Student.cs

public class Student 
{ 
    public long ID { get; set; } 
    public string ChildName { get; set; } 
    public DateTime ChildDOB { get; set; } 
    public DateTime AdmissionDate { get; set; } 
    /* removed for brewity*/ 

    public string Address { get; set; } 

    public Lead Source { get; set; } 
    public Session CurrentSession 
    { 
     get 
     { 
      return (StudentSessions != null && StudentSessions.Any(x => x.Session.IsCurrentlyRunning)) 
       ? StudentSessions.First(x => x.Session.IsCurrentlyRunning).Session : null; 
     } 
    } 

    public List<StudentSession> StudentSessions { get; set; } 
} 

Session.cs

public class Session 
{ 
    public long ID { get; set; } 
    public DateTime SessionStart { get; set; } 
    public DateTime SessionEnd { get; set; } 
    public string Class { get; set; } 
    public bool IsCurrentlyRunning { get { return SessionEnd == null || SessionEnd > DateTime.UtcNow; } } 

    public Teacher AssignedTeacher { get; set; } 
    public List<Staff> AssignedStaff { get; set; } 
    public List<StudentSession> StudentSessions { get; set; } 
} 

StudentSession.cs

public class StudentSession 
{ 
    public long ID { get; set; } 
    public long StudentID { get; set; } 
    public long SessionID { get; set; } 

    public Student Student { get; set; } 
    public Session Session { get; set; } 

    public List<SessionTerm> SessionTerms { get; set; } 
} 

StudentController.cs

public class StudentController : Controller 
{ 
    MasterContext db; 

    public StudentController(MasterContext dbcontext) { db = dbcontext; } 

    public async Task<IActionResult> Index([FromRoute]long ID, [FromQuery]string view, [FromQuery]int page) 
    { 
     IQueryable<Student> studentqry; 
     switch (view) 
     { 
      case "ListAll": 
       studentqry = from s in db.Students select s; 
       return View(viewName: view, model: await studentqry.OrderByDescending(x => x.AdmissionDate).Skip(page * 50).Take(50).ToListAsync()); 
      case "Create": 
      case "Profile": 
       studentqry = (from s in db.Students where s.ID == ID select s) 
        .Include(x => x.Source).ThenInclude(x=>x.Interactions) 
        .Include(x => x.StudentSessions); 
       return View(viewName: view, model: await studentqry.SingleAsync()); 
      case "Edit": 
      case "EditInteraction": 
      case "ListInteractions": 
      default: return View(viewName: "Default"); 
     } 
    } 
} 

Поскольку StudentSessions в Student оказывает один-многим, я не могу загрузить связанные данные сеанса работы с помощью ThenInclude в StudentSessions для всех StudentSessions студента.

Я пробовал читать документы и искать в google, но из-за того, что Entity-Framework Core относительно новый, на данный момент не так много справки. Любая помощь высоко ценится.

+0

Возможно '.Include (x => x.StudentSessions) .ThenInclude (x => x.Session);'? Ядро вашей проблемы не совсем понятно для меня. – grek40

+0

@ grek40 нет .ThenInclude (x => x.Session) Я обновил вопрос соответственно –

+0

Это действительно должно работать для коллекций, поэтому ваша проблема может быть чем-то другим. – grek40

ответ

1

Оказалось, что проблема связана с Visual Studio Intellisense, написав свойство навигации, скомпилированную и отлично работающую.

.Include(x => x.StudentSessions).ThenInclude(x => x.Session) 
+0

потратил 2 часа из-за этого спасибо за добавление ответа. – causita