获取外键表的所有列以及 LINQ 中的主表列

Posted

技术标签:

【中文标题】获取外键表的所有列以及 LINQ 中的主表列【英文标题】:Get all Column of foreign key table along with main table column in LINQ 【发布时间】:2016-07-10 06:37:37 【问题描述】:

我正在尝试获取所有学生的所有科目的列表(学生列表中的科目列表)。

Subject 表(SubjectPk,StudentId,SubjectName,Description,AddedOn,AddedBy)有很多针对单个学生的主题。

我试过这个:没有运气

     var data = (from st in db.Student                     
                       join sub in db.Subject on st.StudentId equals  sub.st.StudentId into subjectsList

                       select new StudentModel
                       
                           Name = st.Name,
               Class= st.Class,
               RollNo = st.RollNo,
                           SubjectList = subjectsList //public ILIst<Subject> SubjectList get;set;
                       ).ToList();

还有这个:没有运气

var data = (from st in db.Student                     
                       select new StudentModel
                       
                           Name = st.Name,
               Class= st.Class,
               RollNo = st.RollNo,
                           SubjectList = db.Subject.where(s.StudentId == st.StudentId).ToList()

                       ).ToList();

var data = (from st in db.Student                     
                   let subjectsList = db.Subject.where(s.StudentId == st.StudentId).ToList()

                   select new StudentModel
                   
                       Name = st.Name,
           Class= st.Class,
           RollNo = st.RollNo,
                       SubjectList = subjectsList 
                   ).ToList();

【问题讨论】:

【参考方案1】:

由于这看起来像是学生和学科之间的多对多关系,理想情况下,您应该有一个不同的表来引用学生和学科。所以你应该有这样的东西:

public class Student
   public int Idget; set;
   public string StudentNameget; set;
   public IList<StudentsSubjects> Subjectsget; set;
   // other properties


public class Subject
   public int Idget; set;
   public string SubjectTitleget; set;
   public IList<StudentsSubjects> Studentsget; set;
   // other properties


public class StudentsSubjects
  public int Idget; set;
  public int StudentIdget; set;
  public int SubjectIdget; set;
  public DateTime DateAddedget; set;

那么,如果你使用实体框架,你会这样做

data = db.Student.Include(s => s.Subjects).ToList()

然后使用 foreach 循环并获取您想要的数据。

【讨论】:

是的,你是对的,但遗憾的是我没有使用实体框架:(。 您是否只想获取主题? 不,我喜欢获取 st.Name、st.Class、st.RollNo 和 subjectList【参考方案2】:

您的第一次尝试看起来不错,只是我将 sub.st.StudentId 删除为 sub.StudentId

 var data = (from st in db.Student                     
                   join sub in db.Subject on st.StudentId equals 
                   sub.StudentId into subjectsList

                   select new StudentModel
                   
                       Name = st.Name,
           Class= st.Class,
           RollNo = st.RollNo,
                       SubjectList = subjectsList //public ILIst<Subject> SubjectList get;set;
                   ).ToList();

【讨论】:

实际上它只会检索主题表的一列,我需要全部,这可以通过简单的方式使用 join 来实现【参考方案3】:

也许您可以为主题列表添加ToList()。请试试这个:

 var data = (from st in db.Student                     
             join sub in db.Subject on st.StudentId equals  sub.st.StudentId into subjectsList
             select new StudentModel
             
                 Name = st.Name,
                 Class= st.Class,
                 RollNo = st.RollNo,
                 SubjectList = subjectsList.ToList() //public ILIst<Subject> SubjectList get;set;
             ).ToList();

【讨论】:

以上是关于获取外键表的所有列以及 LINQ 中的主表列的主要内容,如果未能解决你的问题,请参考以下文章

SQL中有主外键的两表到底那这是主表

SQL怎么在有外键的主键表中插数据

如何在有外键关系的表中删除数据

我如何使用条件从其他表中更新表中的数据

Oracle 获取表的主键外键以及唯一约束条件

JOOQ 获取外键表