【问题标题】:EF Core query full join between many-to-many relationEF Core查询多对多关系之间的完全联接
【发布时间】:2020-04-29 02:58:39
【问题描述】:

我正在使用 EF 核心,我在 STUDENTS 和 SUBJECTS 之间存在多对多关系,如下所示:

public class StudentDetail
    {
        [Key]
        [JsonPropertyName("Id")]
        public int Id { get; set; }
        [Required]
        [Column(TypeName ="nvarchar(50)")]
        [JsonPropertyName("Name")]
        public string Name { get; set; }
        [JsonPropertyName("StudentSubjects")]
        public virtual IEnumerable<StudentSubject> StudentSubjects {get; set;}
    }

 public class SubjectDetail
    {

        [Key]
        [JsonPropertyName("Id")]
        public int Id { get; set; }
        [Required]
        [Column(TypeName = "nvarchar(20)")]
        [JsonPropertyName("SubjectName")]
        public string SubjectName { get; set; }
        [Required]
        [JsonPropertyName("Teacher")]
        public virtual TeacherDetail Teacher { get; set; }
        [JsonPropertyName("StudentSubjects")]
        public IEnumerable<StudentSubject> StudentSubjects { get; set; }
    }

public class StudentSubject
    {

        [JsonPropertyName("StudentId")]
        public int StudentId { get; set; }

        [JsonPropertyName("Student")]
        public StudentDetail Student { get; set; }

        [JsonPropertyName("SubjectId")]
        public int SubjectId { get; set; }

        [JsonPropertyName("Subject")]
        public SubjectDetail Subject { get; set; }
        [Required]
        [Column(TypeName = "nvarchar(3)")]
        [JsonPropertyName("Grade")]
        public string Grade { get; set; }
    }

我使用迁移创建我的数据库,所以在我进行迁移之后,数据库是这样创建的:

我需要一个查询,将所有科目与他们的老师和特定学生的年级一起带给我。我试着这样做:

var subjects = await _context.StudentSubject
                               .Include(s => s.Subject)
                               .Where(sid => sid.StudentId == student.Id)
                               .Select(st => st.Subject)
                               .Include(t => t.Teacher)
                               .ToListAsync();

但我收到一条错误消息,说我正在尝试在不可查询的实体上使用Include();。有人知道我在做什么错吗?

【问题讨论】:

  • 您想使用public virtual ICollection&lt;T&gt; 而不是public IEnumerable&lt;T&gt;。可能还有更多需要更改,但这可能会有所帮助。

标签: sql-server linq entity-framework-core


【解决方案1】:

仅当您在两个表之间具有链接并且由 C# 类中的关键字 Virtual 定义时,包含才会起作用。请使用公共虚拟 ICollection 而不是公共 IEnumerable 并关注link 了解更多详情。如果您仍想继续学习相同的课程,请尝试在 Linq 查询中使用 join。

【讨论】:

    猜你喜欢
    • 2019-01-19
    • 1970-01-01
    • 1970-01-01
    • 2021-10-21
    • 2017-11-13
    • 2021-10-11
    • 1970-01-01
    • 2018-06-21
    • 1970-01-01
    相关资源
    最近更新 更多