You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 15:15:07