public async Task <IActionResult> Edit(int?id, byte[] rowVersion)
        {
            if (id == null)
            {
                return(NotFound());
            }

            var departmentToUpdate = await _context.Departments.Include(i => i.Administrator).SingleOrDefaultAsync(m => m.DepartmentID == id);

            if (departmentToUpdate == null)
            {
                Department deletedDepartment = new Department();
                await TryUpdateModelAsync(deletedDepartment);

                ModelState.AddModelError(string.Empty,
                                         "Unable to save changes. The department was deleted by another user.");
                ViewData["InstructorID"] = new SelectList(_context.Instructors, "ID", "FullName", deletedDepartment.InstructorID);
                return(View(deletedDepartment));
            }

            _context.Entry(departmentToUpdate).Property("RowVersion").OriginalValue = rowVersion;

            if (await TryUpdateModelAsync <Department>(
                    departmentToUpdate,
                    "",
                    s => s.Name, s => s.StartDate, s => s.Budget, s => s.InstructorID))
            {
                try
                {
                    await _context.SaveChangesAsync();

                    return(RedirectToAction("Index"));
                }
                catch (DbUpdateConcurrencyException ex)
                {
                    var exceptionEntry = ex.Entries.Single();
                    var clientValues   = (Department)exceptionEntry.Entity;
                    var databaseEntry  = exceptionEntry.GetDatabaseValues();
                    if (databaseEntry == null)
                    {
                        ModelState.AddModelError(string.Empty,
                                                 "Unable to save changes. The department was deleted by another user.");
                    }
                    else
                    {
                        var databaseValues = (Department)databaseEntry.ToObject();

                        if (databaseValues.Name != clientValues.Name)
                        {
                            ModelState.AddModelError("Name", $"Current value: {databaseValues.Name}");
                        }
                        if (databaseValues.Budget != clientValues.Budget)
                        {
                            ModelState.AddModelError("Budget", $"Current value: {databaseValues.Budget:c}");
                        }
                        if (databaseValues.StartDate != clientValues.StartDate)
                        {
                            ModelState.AddModelError("StartDate", $"Current value: {databaseValues.StartDate:d}");
                        }
                        if (databaseValues.InstructorID != clientValues.InstructorID)
                        {
                            Instructor databaseInstructor = await _context.Instructors.SingleAsync(i => i.ID == databaseValues.InstructorID);

                            ModelState.AddModelError("InstructorID", $"Current value: {databaseInstructor.FullName}");
                        }

                        ModelState.AddModelError(string.Empty, "The record you attempted to edit "
                                                 + "was modified by another user after you got the original value. The "
                                                 + "edit operation was canceled and the current values in the database "
                                                 + "have been displayed. If you still want to edit this record, click "
                                                 + "the Save button again. Otherwise click the Back to List hyperlink.");
                        departmentToUpdate.RowVersion = (byte[])databaseValues.RowVersion;
                        ModelState.Remove("RowVersion");
                    }
                }
            }
            ViewData["InstructorID"] = new SelectList(_context.Instructors, "ID", "FullName", departmentToUpdate.InstructorID);
            return(View(departmentToUpdate));
        }
        public async Task OnGetAsync(int?id, int?courseID)
        {
            Instructor             = new InstructorIndexData();
            Instructor.Instructors = await _context.Instructors
                                     .Include(i => i.OfficeAssignment)
                                     .Include(i => i.CourseAssignments)
                                     .ThenInclude(i => i.Course)
                                     .ThenInclude(i => i.Department)
                                     // .Include(i => i.CourseAssignments)
                                     //    .ThenInclude(i => i.Course)
                                     //        .ThenInclude(i => i.Enrollments)
                                     //            .ThenInclude(i => i.Student)
                                     //.AsNoTracking()       取消显示全部加载,
                                     .OrderBy(i => i.LastName)
                                     .ToListAsync();

            /*   SELECT[i].[ID], [i].[FirstName], [i].[HireDate], [i].[LastName], [i.OfficeAssignment].[InstructorID], [i.OfficeAssignment].[Location]
             *   FROM[Instructor] AS[i]
             *     LEFT JOIN[OfficeAssignment] AS[i.OfficeAssignment] ON[i].[ID] = [i.OfficeAssignment].[InstructorID]
             *   ORDER BY[i].[LastName], [i].[ID]
             *
             *   生成一下两个查询,效率感觉很低呀
             *
             *   SELECT[i.CourseAssignments].[CourseID], [i.CourseAssignments].[InstructorID], [c.Course].[CourseID], [c.Course].[Credits], [c.Course].[DepartmentID], [c.Course].[Title]
             *   FROM[CourseAssignment] AS[i.CourseAssignments]
             * I            NNER JOIN[Course] AS[c.Course] ON[i.CourseAssignments].[CourseID] = [c.Course].[CourseID]
             *        INNER JOIN(
             *                   SELECT DISTINCT [i0].[ID], [i0].[LastName]
             *                    FROM [Instructor] AS [i0]
             *                    LEFT JOIN [OfficeAssignment] AS[i.OfficeAssignment0] ON [i0].[ID] = [i.OfficeAssignment0].[InstructorID]
             *                   ) AS[t] ON[i.CourseAssignments].[InstructorID] = [t].[ID]
             *   ORDER BY[t].[LastName], [t].[ID]
             */
            //if (id != null)
            //{
            //    InstructorID = id.Value;
            //    Instructor instructor = Instructor.Instructors.Where(i => i.ID == id.Value).Single(); //集合仅包含一个选项的时候才能用,空或者多个都会报异常
            //    Instructor.Courses = instructor.CourseAssignments.Select(s => s.Course);
            //}
            //if (courseID != null)
            //{
            //    CourseID = courseID.Value;
            //    Instructor.Enrollments = Instructor.Courses.Where(x => x.CourseID == courseID).Single().Enrollments;
            //}

            if (id != null)
            {
                InstructorID = id.Value;
                Instructor instructor = Instructor.Instructors.Single(//直接在Single里面调用where条件
                    i => i.ID == id.Value);
                Instructor.Courses = instructor.CourseAssignments.Select(
                    s => s.Course);
            }

            //if (courseID != null)
            //{
            //    CourseID = courseID.Value;
            //    Instructor.Enrollments = Instructor.Courses.Single(
            //        x => x.CourseID == courseID).Enrollments;
            //} 用下列进行显示load加载


            if (courseID != null)
            {
                CourseID = courseID.Value;
                var selectedCourse = Instructor.Courses.Where(x => x.CourseID == courseID).Single();
                await _context.Entry(selectedCourse).Collection(x => x.Enrollments).LoadAsync();

                foreach (Enrollment enrollment in selectedCourse.Enrollments)
                {
                    await _context.Entry(enrollment).Reference(x => x.Student).LoadAsync();
                }
                Instructor.Enrollments = selectedCourse.Enrollments;
            }
        }