使用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
相关产品推荐
相关产品推荐

