没有外键的Linq多对多关系

Linq many to many relationship with no foreign key

我正在使用 linq 处理多对多关系,其中没有外键,但交集 table 是基于模型上的实体集合在幕后为我创建的。

给出以下 类

public class BaseEntity
{
    public int Id { get; set; }

    public DateTime DateUpdated { get; set; }
}

public class Student : BaseEntity
{
    public string Name { get; set; }

    [JsonIgnore]
    public ICollection<Course> Courses { get; set; }
}

public class Course : BaseEntity
{
    public string Name { get; set; }

    public ICollection<Student> Students { get; set; }
}

和创建的 table

dbo.Courses
dbo.Students
dbo.CourseStudent // (but this is not in my context class as ef generated it for me when I ran my migration)

我正在使用 Blazor,在我的一个组件中我得到了一名学生,我想从那里获得学生分配到的课程,但我在查询时遇到问题并尝试了以下和许多其他

// What I'm trying to achieve
// select * from courses where students.id == id
// or
// select * from courses where students contains student.id

public async Task<List<Course>> GetByStudent(int id) // studentId
{
    return await _db.Courses.GroupBy(x => x.Students.Where(x => x.Id == id)).ToList();
    return await _db.Courses.Include(x => x.Students).Where(x => x.Id == id).ToListAsync();                              
}

感谢阅读,希望对您有所帮助!

任何人都可以指出我如何通过学生导航获取单个学生的所有课程的正确方向 属性。

或者,在没有外键的情况下使用 linq 访问导航的方法 属性。

direction of how I can get all courses for a single student by the student navigation property.

context.Students.Include(s => s.Courses).First(s => s.Id == studentId)

Include 使 EF 编写联接以为学生引入相关课程。它正在通过映射 table 是 EF 的工作,而不是你的..

旁注,尽管 include 确实加入,但在您在 where 或 select 子句中明确提及属性和导航的情况下,不一定需要。有关 Include 和 Select

之间相互作用的更多信息,请参阅 Gert 的详细回答