EF Core一对多关联查询如何改为Inner Join而非Left Join?
实现Inner Join的查询修改方案
你的原查询会返回所有部门(包括没有学生的部门),因为从Department表发起查询时,子查询仅关联学生但未过滤无学生的部门,所以EF生成了Left Join。要实现Inner Join,核心是只保留存在对应学生的部门,以下是几种可行的修改方式:
方案1:使用Join + GroupBy 构建原生Inner Join
这种方式直接通过Join关联两张表,再按部门分组,天然只会返回有学生的部门,EF会生成标准的Inner Join语句:
var data = (from dept in _dbContext.Department join student in _dbContext.Student on dept.DeptId equals student.DeptId group student by dept into grouped select new CollegeData { DeptId = grouped.Key.DeptId, DeptName = grouped.Key.DeptName, Students = grouped.Select(s => new StudentData { StudentId = s.StudentId, StudentName = s.StudentName }).ToList() }).ToList();
方案2:基于原查询添加过滤条件(推荐)
利用实体类的导航属性Students,通过Any()方法过滤掉没有学生的部门,EF会自动将其转换为Inner Join逻辑,同时代码更简洁:
var data = (from dept in _dbContext.Department // 过滤仅保留存在学生的部门 where dept.Students.Any() select new CollegeData { DeptId = dept.DeptId, DeptName = dept.DeptName, // 直接使用导航属性关联学生,无需再次查询Student表 Students = dept.Students.Select(s => new StudentData { StudentId = s.StudentId, StudentName = s.StudentName }).ToList() }).ToList();
方案3:从Student表发起查询并分组
如果业务逻辑允许,也可以从Student表出发,按所属部门分组后构建结果,同样会生成Inner Join:
var data = (from student in _dbContext.Student group student by student.Department into grouped select new CollegeData { DeptId = grouped.Key.DeptId, DeptName = grouped.Key.DeptName, Students = grouped.Select(s => new StudentData { StudentId = s.StudentId, StudentName = s.StudentName }).ToList() }).ToList();
内容的提问来源于stack exchange,提问作者csharp newbie
相关产品推荐
相关产品推荐

