EF Core 5.0 中EF 4.0的GroupJoin左连接查询无法翻译抛出异常
问题原因及解决方法
1. 核心错误:左连接操作顺序不符合EF Core 5翻译规则
你当前的查询执行顺序为:
- 对
User和Address执行GroupJoin(也就是join into语法) - 穿插和
JobTitle的内连接 - 最后才对Address的GroupJoin结果执行
DefaultIfEmpty展开左连接
EF Core 5的LINQ翻译器不支持在GroupJoin和对应的DefaultIfEmpty之间插入其他连接操作,导致无法生成SQL抛出异常。
2. 次要错误:变量引用错误
你内连接JobTitle的代码中使用了未声明的变量e,应该改为u.JobTitleId才能正确关联User表的职务ID字段。
正确写法示例
将左连接的DefaultIfEmpty操作紧跟在对应的join into之后,再执行后续的其他连接即可:
var users = (from u in this.MyDbContext.User join a in this.MyDbContext.Address on u.UserId equals a.UserId into ua // 做完GroupJoin立刻执行DefaultIfEmpty展开左连接结果 from ua_left in ua.DefaultIfEmpty() // 再执行和JobTitle的内连接 join d in this.MyDbContext.JobTitle on u.JobTitleId equals d.JobTitleId select new UserViewModel { BoardId = u.BoardId, UserId = u.UserId, LastName = u.LastName, FirstName = u.FirstName, JobTitleId = u.JobTitleId, JobTitle = d.JobTitleDescription, Email = u.Email, Grade = u.Grade, Title = u.Title, // 现在可以正常读取左连接的Address字段,为空时自行处理默认值即可 StartDate = ua_left != null ? ua_left.StartDate : null }); var test = users.ToList();
补充说明
你之前在查询末尾加ToList无效的原因是:异常发生在EF Core尝试将LINQ表达式翻译为SQL的阶段,还没到实际执行查询的步骤,只有把查询改写为可翻译的形式才能正常执行。
内容的提问来源于stack exchange,提问作者user1250264
相关产品推荐
相关产品推荐

