用于连接多对多表的 Linq 查询

Posted

技术标签:

【中文标题】用于连接多对多表的 Linq 查询【英文标题】:Linq query for joining many to many tables 【发布时间】:2021-04-02 00:46:58 【问题描述】:

我是 LINQ 的新手,需要您的建议。 我有 2 个这样的表:

public class Subjects

    public Subjects()
    
        Classes = new List<Classes>();
    

    public int Id  get; set; 
    public string SubjectName  get; set; 

    public virtual List<Classes> Classes  get; set; 


public class Classes

    public Classes()
    
        Subjects = new List<Subjects>();
    

    public int Id  get; set; 
    public string ClassName  get; set; 

    public virtual List<Subjects> Subjects  get; set; 

和实体框架创建SubjectClasses

public SubjectsMap()

    this.HasKey(s => s.Id);

    this.Property(s => s.SubjectName)
        .IsRequired()
        .HasMaxLength(50);

    this.ToTable("Subjects");

    this.HasMany(c => c.Classes)
        .WithMany(s => s.Subjects)
        .Map(cs =>
        
            cs.MapLeftKey("SubjectId");
            cs.MapRightKey("ClassId");
            cs.ToTable("SubjectClasses");
        );

Subject---- SubjectClasses ----- 类

我的上下文没有 SubjectClasses,所以我需要将 SQL 查询转换为 Linq 或 Lambda。但是 Linqpad 对我没有帮助,或者我无法使用它。我只是想取名字,主题名

SELECT st.Firstname, s.SubjectName 
FROM SubjectClasses sc
    INNER JOIN Subjects s on s.Id = sc.SubjectId
    INNER JOIN Students st on st.ClassId = sc.ClassId
WHERE sc.ClassId = 3

【问题讨论】:

喜欢这个? context.Subjects.SelectMany(s =&gt; s.Classes, (s, c) =&gt; new s.SubjectName, c.ClassName) 我怎样才能显示students.Firstname? 【参考方案1】:

它正在工作。

               (from st in context.Students
                from s in context.Subjects
                join c in context.Classes
                on new  stuId = st.ClassId  equals new  stuId = c.Id 
                select new ComplexExamResult
                
                    Id = c.Id,
                    Firstname = st.Firstname,
                    SubjectName = s.SubjectName
                ).Where(c => c.Id == classId).AsNoTracking().ToList();

【讨论】:

以上是关于用于连接多对多表的 Linq 查询的主要内容,如果未能解决你的问题,请参考以下文章

来自两个多对多表的MYSQL搜索查询优化

MySQL 基础 -- 多表关系(一对一1对多(多对一)多对多)多表查询(内连接外连接自连接子查询(嵌套查询)联合查询 union)笛卡儿积

hibernate关联关系(多对多)

python flask(多对多表查询)

多对多表的增删改查与drf的分页

跨多对多表的关系