LINQ新手求助:Entity Data Model下多对多表关联查询问题
解决Entity Data Model中多对多关联的LINQ查询问题
别担心,这是Entity Framework(EF)的正常设计逻辑!当你的中间表STUDENT_COURSE只包含两个外键(分别关联STUDENT和COURSES)、没有其他额外业务字段时,EDM会自动把这个多对多关系“封装”起来,直接在Student和Course实体之间生成导航属性,不需要你再手动操作中间表啦。
下面给你几个实用的查询示例,帮你快速适配这种新的关联方式:
1. 查询所有学生及其所选的全部课程
用LINQ查询语法的话,写法非常直观:
var studentCourses = from s in dbContext.STUDENT select new { StudentId = s.Id, StudentName = s.Name, SelectedCourses = s.COURSES.Select(c => new { CourseId = c.Id, CourseName = c.Name }).ToList() };
如果习惯用方法语法,也可以这样写:
var studentCourses = dbContext.STUDENT .Select(s => new { StudentId = s.Id, StudentName = s.Name, SelectedCourses = s.COURSES.Select(c => new { CourseId = c.Id, CourseName = c.Name }).ToList() }) .ToList();
这里的s.COURSES就是EF自动生成的导航属性,直接对应该学生关联的所有课程,完全替代了你之前在DBML里需要手动关联STUDENT_COURSE的步骤。
2. 查询特定学生的所选课程
比如要查找ID为1的学生选了哪些课:
var targetStudentCourses = dbContext.STUDENT .FirstOrDefault(s => s.Id == 1)? .COURSES .Select(c => new { c.Id, c.Name }) .ToList();
用查询语法也能实现:
var targetStudentCourses = (from s in dbContext.STUDENT where s.Id == 1 from c in s.COURSES select new { c.Id, c.Name }).ToList();
3. 反向查询:查询某门课程的所有选课学生
同理,COURSES实体也会有对应的导航属性(比如STUDENT或者EnrolledStudents,具体名称取决于你EDM的生成设置),写法类似:
var courseEnrollees = dbContext.COURSES .FirstOrDefault(c => c.Id == 101)? .STUDENT .Select(s => new { s.Id, s.Name }) .ToList();
小提示
如果你不确定导航属性的具体名称,可以打开你的EDM模型文件(.edmx),查看Student实体的属性列表——里面会有一个集合类型的属性(比如ICollection<COURSES>),那就是关联课程的导航属性;反过来COURSES实体也会有对应的学生集合属性。
内容的提问来源于stack exchange,提问作者Alexander Chef
相关产品推荐
相关产品推荐

