请教ASP.NET MVC5+EF6预加载示例中的重复加载逻辑问题
关于ASP.NET MVC 5+EF6中讲师页面数据加载逻辑的疑问
问题背景与代码
正在阅读微软ASP.NET MVC 5和EF 6的官方教程,对一段控制器代码的逻辑存在疑惑:
控制器Action代码
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; viewModel.Enrollments = viewModel.Courses.Where( x => x.CourseID == courseID).Single().Enrollments; } return View(viewModel); }
视图模型类代码
public class InstructorIndexData { public IEnumerable<Instructor> Instructors { get; set; } public IEnumerable<Course> Courses { get; set; } public IEnumerable<Enrollment> Enrollments { get; set; } }
核心疑问
代码已经通过Include预加载了所有讲师及其关联的OfficeAssignment、讲师名下的所有Course,以及每个Course关联的Department:
viewModel.Instructors = db.Instructors .Include(i => i.OfficeAssignment) .Include(i => i.Courses.Select(c => c.Department)) .OrderBy(i => i.LastName);
但当选中讲师(id参数不为null)时,还要执行viewModel.Courses = viewModel.Instructors.Where(i => i.ID == id.Value).Single().Courses;重新给viewModel.Courses赋值,想知道这个逻辑的必要性。
逻辑解释
这么做的核心目的是为了给视图层提供更清晰、易用的结构化数据,具体原因有三点:
- 简化视图渲染:视图需要展示选中讲师的课程列表,如果每次都从
viewModel.Instructors集合里筛选对应讲师的课程,视图代码会变得冗余。把筛选后的课程集合单独赋值给viewModel.Courses,视图可以直接绑定这个属性,代码更简洁易维护。 - 符合视图模型的设计原则:
InstructorIndexData的设计就是为了封装当前视图所需的分层数据——所有讲师的全局列表、选中讲师的课程列表、选中课程的选课记录。这种结构让视图能清晰区分全局数据和当前选中的详情数据,完全贴合MVC模式中视图模型的职责。 - 优化后续逻辑连贯性:当用户进一步选中某门课程(
courseID不为null)时,代码可以直接通过viewModel.Courses筛选对应课程的选课记录,不用再从整个讲师集合里二次查找,逻辑更连贯,可读性更强。
另外要说明的是,因为已经通过Include完成了预加载,后续的筛选操作都是在内存中执行的,不会触发额外的数据库查询,不存在性能浪费的问题。
内容的提问来源于stack exchange,提问作者Liuc
相关产品推荐
相关产品推荐

