// GET: Instructors
        public async Task<ActionResult> Index(int? id, int? courseID)
        {
            //var instructors = db.Instructors.Include(i => i.OfficeAssignment);
            //return View(await instructors.ToListAsync());

            var viewModel = new InstructorIndexData();
            viewModel.Instructors = db.Instructors
                .Include(i => i.OfficeAssignment)
                .Include(i => i.Courses.Select(c => c.Department))
                .OrderBy(i => i.LastName);

            if (id != null)
            {
                ViewBag.InstructorID = id.Value;
                viewModel.Courses = viewModel.Instructors.Where(i => 
                    i.InstructorID == id.Value).Single().Courses;
            }

            if (courseID != null)
            {
                ViewBag.CourseID = courseID.Value;
                viewModel.Enrollments = viewModel.Courses.Where(
                    x => x.CourseID == courseID).Single().Enrollments;
            }

            return View(viewModel);
        }
        // GET: Instructor
        public ActionResult Index(int? id, int? courseID)
        {
            var viewModel = new InstructorIndexData();
            viewModel.Instructors = db.Instructors
                .Include(i => i.OfficeAssignment)
                .Include(i => i.Courses.Select(c => c.Department))
                .OrderBy(i => i.LastName);

            if (id != null)
            {
                ViewBag.InstructorID = id.Value;
                viewModel.Courses = viewModel.Instructors
                    .Where(i => i.ID == id.Value)
                    .Single()
                    .Courses;
            }

            if (courseID != null)
            {
                ViewBag.CourseID = courseID.Value;
                //Lazy loading
                //viewModel.Enrollments = viewModel.Courses.Where(x => x.CourseID == courseID).Single().Enrollments;
                //Explicit loading
                var selectedCourse = viewModel.Courses.Where(x => x.CourseID == courseID).Single();
                db.Entry(selectedCourse).Collection(x => x.Enrollments).Load();
                foreach (Enrollment enrollment in selectedCourse.Enrollments)
                {
                    db.Entry(enrollment).Reference(x => x.Student).Load();
                }

                viewModel.Enrollments = selectedCourse.Enrollments;
            }

            return View(viewModel);
        }
        // GET: Instructor
        public ActionResult Index(int? id, int? courseID)
        {
            var viewModel = new InstructorIndexData();

            viewModel.Instructors = db.Instructors
                .Include(i => i.OfficeAssignment)
                .Include(i => i.Courses.Select(c => c.Department))
                .OrderBy(i => i.LastName);

            if (id != null)
            {
                ViewBag.InstructorID = id.Value;
                viewModel.Courses = viewModel.Instructors
                    .Single(i => i.ID == id.Value).Courses;
            }

            if (courseID != null)
            {
                ViewBag.CourseID = courseID.Value;
                viewModel.Enrollments = viewModel.Courses
                    .Single(x => x.CourseID == courseID).Enrollments;
            }

            var instructors = db.Instructors.Include(i => i.OfficeAssignment);
            return View(viewModel);
        }
        //
        // GET: /Instructor/

        public ActionResult Index(int? id, int? courseID)
        {
            var viewModel = new InstructorIndexData();
            viewModel.Instructors = instructorRepository.GetInstructorsWithOfficeAssigmentAndCourses()
                .OrderBy(i => i.LastName);

            if (id != null)
            {
                ViewBag.InstructorID = id.Value;
                viewModel.Courses = viewModel.Instructors.
                    Where(i => i.InstructorID == id.Value).Single().Courses;
            }

            if (courseID != null)
            {
                ViewBag.CourseID = courseID.Value;
                viewModel.Enrollments = viewModel.Courses
                    .Where(c => c.CourseID == courseID.Value).Single().Enrollments;
            }

            return View(viewModel);
        }
        //
        // GET: /Instructor/
        public ActionResult Index(Int32? id, Int32? courseID)
        {
            var viewModel = new InstructorIndexData();
            viewModel.Instructors = db.Instructors
                .Include(i => i.Courses.Select(c => c.Department))
                .OrderBy(i => i.LastName);

            if (id != null)
            {
                ViewBag.PersonID = id.Value;
                viewModel.Courses = viewModel.Instructors.Where(i => i.PersonID == id.Value).Single().Courses;
            }

            //if (courseID != null)
            //{
            //    ViewBag.CourseID = courseID.Value;
            //    viewModel.Enrollments = viewModel.Courses.Where(x => x.CourseID == courseID).Single().Enrollments;
            //}

            if (courseID != null)
            {
                ViewBag.CourseID = courseID.Value;

                var selectedCourse = viewModel.Courses.Where(x => x.CourseID == courseID).Single();
                db.Entry(selectedCourse).Collection(x => x.Enrollments).Load();
                foreach (Enrollment enrollment in selectedCourse.Enrollments)
                {
                    db.Entry(enrollment).Reference(x => x.Student).Load();
                }

                viewModel.Enrollments = selectedCourse.Enrollments;
            }

            return View(viewModel);
        }
        //
        // GET: /Instructor/
        public ActionResult Index(int? id, int? courseID)
        {
            var viewModel = new InstructorIndexData();
            viewModel.Instructors = db.Instructors
                .Include(i => i.OfficeAssignment)
                .Include(i => i.Courses.Select(c => c.Department)) // loads Courses, and for each Course that is loaded it does eager loading for the Course.Department navigation property.
                .OrderBy(i => i.LastName);
            /*
             * When you retrieved the list of instructors, you specified eager loading for the Courses navigation property and for the Department
             * property of each course. Then you put the Courses collection in the view model, and now you're accessing the Enrollments navigation
             * property from one entity in that collection. Because you didn't specify eager loading for the Course.Enrollments navigation property,
             * the data from that property is appearing in the page as a result of lazy loading.
             */

            if (id != null)
            {
                /*
                 If an instructor ID was selected, the selected instructor is retrieved from the list of instructors in the view model.
                 * The view model's Courses property is then loaded with the Course entities from that instructor's Courses navigation property.
                 *
                 */
                ViewBag.PersonID = id.Value;
                viewModel.Courses = viewModel.Instructors.Where(
                    i => i.PersonID == id.Value).Single().Courses;
                /*
                 You use the Single method on a collection when you know the collection will have only one item. The Single method throws
                 * an exception if the collection passed to it is empty or if there's more than one item. An alternative is SingleOrDefault,
                 * which returns a default value (null in this case) if the collection is empty. However, in this case that would still result
                 * in an exception (from trying to find a Courses property on a null reference), and the exception message would less clearly
                 * indicate the cause of the problem.
                 */
            }

            if (courseID != null)
            {
                ViewBag.CourseID = courseID.Value;
                // lazy loading
                //viewModel.Enrollments = viewModel.Courses.Where(
                //    x => x.CourseID == courseID).Single().Enrollments;

                // example of explicit loading of the Enrollments property.
                var selectedCourse = viewModel.Courses.Where(x => x.CourseID == courseID).Single();
                db.Entry(selectedCourse).Collection(x => x.Enrollments).Load(); //  explicitly loads that course's Enrollments navigation property:
                foreach (Enrollment enrollment in selectedCourse.Enrollments)
                {
                    db.Entry(enrollment).Reference(x => x.Student).Load(); // explicitly loads each Enrollment entity's related Student entity:
                }
                /* Notice that you use the Collection method to load a collection property, but for a property that holds just one entity, you use the Reference method. */

                viewModel.Enrollments = selectedCourse.Enrollments;
            }

            return View(viewModel);
        }
        //
        // GET: /Instructor/
        /// <summary>
        /// The method accepts optional query string parameters that provide the ID values of the selected instructor 
        /// and selected course, and passes all of the required data to the view. The query string parameters are 
        /// provided by the Select hyperlinks on the page.
        /// </summary>
        public ActionResult Index(Int32? id, Int32? courseID)
        {
            var viewModel = new InstructorIndexData();

            viewModel.Instructors = db.Instructors
                .Include(i => i.Courses.Select(c => c.Department))
                .OrderBy(i => i.LastName);

            if (id != null)
            {
                ViewBag.PersonID = id.Value;
                viewModel.Courses = viewModel.Instructors.Where(i => i.PersonID == id.Value).Single().Courses;
            }

            if (courseID != null)
            {
                ViewBag.CourseID = courseID.Value;

                // explicit loading
                var selectedCourse = viewModel.Courses.Where(x => x.CourseID == courseID).Single();
                db.Entry(selectedCourse).Collection(x => x.Enrollments).Load();

                foreach (Enrollment enrollment in selectedCourse.Enrollments)
                {
                    // normally use the Collection method to load a collection property, but
                    // for a property that holds just one entity, you use the Reference method
                    db.Entry(enrollment).Reference(x => x.Student).Load();
                }

                viewModel.Enrollments = selectedCourse.Enrollments;
            }

            return View(viewModel);
        }