获取外键表的所有列以及 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 中的主表列的主要内容,如果未能解决你的问题,请参考以下文章