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

使用Entity Framework实现3表关联的LINQ multiple joins查询方法

LINQ多关联表查询实现方案

最终代码

直接修改你的查询逻辑即可,无需额外循环遍历,同时补全姓名拼接、参数过滤逻辑以及异常抛出的优化处理:

public List<SiteVisitsScheduleDTO> GetAllTEST(int selectedTaxID, bool completedVisits)
{
    try
    {
        var SVQ = from schedules in ObjContext.SiteVisitsSchedules.AsQueryable()
                  // 关联获取排班人对应姓名
                  join managers1 in ObjContext.NetworkManagers.AsQueryable() 
                    on schedules.ScheduledBy equals managers1.ManagerID
                  // 关联获取完成人对应姓名,左连接适配未完成拜访无完成人的场景
                  join managers2 in ObjContext.NetworkManagers.AsQueryable() 
                    on schedules.CompletedBy equals managers2.ManagerID into m2Group
                  from managers2 in m2Group.DefaultIfEmpty()
                  // 关联中间交叉表
                  join crosswalk in ObjContext.ProviderManagerCrosswalks.AsQueryable() 
                    on schedules.TaxID equals crosswalk.TaxID
                  // 关联获取TaxID绑定的对应管理员姓名
                  join managers3 in ObjContext.NetworkManagers.AsQueryable() 
                    on crosswalk.ManagerID equals managers3.ManagerID
                  // 方法参数过滤逻辑
                  where schedules.TaxID == selectedTaxID
                        && (completedVisits ? schedules.CompletedBy != null : true)
                  select new SiteVisitsScheduleDTO
                  {
                      SiteVisitID = schedules.SiteVisitID,
                      TaxID = schedules.TaxID,
                      ScheduledBy = schedules.ScheduledBy,
                      ScheduledByName = $"{managers1.FirstName} {managers1.LastName}",
                      CompletedBy = schedules.CompletedBy,
                      CompletedByName = managers2 != null ? $"{managers2.FirstName} {managers2.LastName}" : string.Empty,
                      TaxRelatedManagerName = $"{managers3.FirstName} {managers3.LastName}"
                  };

        return SVQ.ToList();
    }
    catch (Exception ex)
    {
        // 此处可按需新增异常日志记录逻辑
        throw;
    }
}

适配说明

  • 你需要先在SiteVisitsScheduleDTO类中新增3个姓名字段:ScheduledByName、CompletedByName、TaxRelatedManagerName,字段命名可根据你的业务习惯调整
  • 如果业务规则要求已完成/未完成的拜访都必须填写完成人,可以去掉CompletedBy对应的左连接逻辑,换回普通join即可
  • 直接在查询中投影到DTO比先查匿名类再循环转换效率更高,EF会自动生成对应SQL仅查询需要的字段,不会返回冗余数据
  • 原代码throw ex会破坏异常调用栈,改为直接throw即可保留原始异常信息,方便后续问题排查

内容的提问来源于stack exchange,提问作者Franko

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 20:48:03