用于连接多对多表的 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 => s.Classes, (s, c) => 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 基础 -- 多表关系(一对一1对多(多对一)多对多)多表查询(内连接外连接自连接子查询(嵌套查询)联合查询 union)笛卡儿积