EF Core项目RTCTrials关联RTCCourses名称展示方案与效率优化咨询
效率问题分析
- 你当前的实现是先拉取三个表的全量数据到内存,再在内存执行Join操作,数据库层面的关联效率远高于内存关联,同时全表加载会带来大量不必要的IO开销
- 手动投影匿名类的方式可维护性极低,后续需要新增字段时必须同步修改投影逻辑
- 你已经在实体中定义了
RTCTrial到RTCCourse的导航属性,完全不需要手动写Join逻辑
优化实现方案
1. EF查询优化(替代手动Join)
如果你封装的All()方法返回的是IQueryable类型,可以直接用Include预加载关联的课程数据,EF会自动在数据库层面生成关联查询语句,不需要手动拼接:
using (var context = new RTCContext()) { var factory = new EntityFrameworkUnitOfWorkFactory(context); var unit = factory.Create(); var festivals = unit.RTCFestivals.All().ToList(); // 预加载关联的课程数据,EF自动做关联查询 var trials = unit.RTCTrials.All().Include(t => t.RTCCourse).ToList(); // 单独拉取课程列表作为下拉框数据源 var courses = unit.RTCCourses.All().ToList(); this.radGridViewFestivalDestinations.DataSource = festivals; // 直接用trials作为子模板数据源,不需要转匿名类 this.radGridViewFestivalDestinations.Templates[0].DataSource = trials; // 后续列适配逻辑保留 // ... }
如果你的All()方法返回的是IEnumerable,建议修改仓储实现返回IQueryable,才能支持EF的查询优化特性。
2. RadGridView下拉列绑定实现
直接给子模板新增组合框列,绑定课程列表即可实现你要的ID匹配显示课程名的效果:
// 先移除原有手动生成的课程名列(如果存在) if(radGridViewFestivalDestinations.Templates[0].Columns.Contains("Course")) { radGridViewFestivalDestinations.Templates[0].Columns.Remove("Course"); } // 新增下拉列 var courseComboColumn = new GridViewComboBoxColumn() { Name = "CourseName", HeaderText = "课程名称", DataSource = courses, // 下拉项显示课程名,值对应课程ID DisplayMember = "CourseName", ValueMember = "CourseID", // 绑定到赛事实体的CourseID字段 FieldName = "CourseID", DisplayIndex = 3 // 调整到你想要的列位置 }; radGridViewFestivalDestinations.Templates[0].Columns.Add(courseComboColumn); // 原有自适应列宽逻辑保留 foreach (GridViewDataColumn column in radGridViewFestivalDestinations.MasterTemplate.Columns) { column.BestFit(); } foreach (GridViewDataColumn column in radGridViewFestivalDestinations.Templates[0].Columns) { column.BestFit(); }
这个方案实现后,下拉列会自动通过CourseID匹配对应的课程名称显示,用户还可以直接在下拉框中修改课程,自动同步RTCTrial实体的CourseID字段,不需要额外写转换逻辑。
额外优化建议
如果数据量很大,可以按需添加AsNoTracking()优化查询性能,不需要跟踪实体变更的场景下可以减少EF的内存开销:
var trials = unit.RTCTrials.All().AsNoTracking().Include(t => t.RTCCourse).ToList();
内容的提问来源于stack exchange,提问作者nenwmn
相关产品推荐
相关产品推荐

