2011-04-11 99 views
1

我试图从我的数据库中检索List<Student>如何从多对多关系中检索实体列表?

基本上,该架构是:

GradeParalelo ---- GradeStudent ---- Student 

凡GradeStudent表适用于GradeParalelo和学生的主键。 注意:GradeStudent表有一个额外的列来保存一个整数。这不仅仅是一个关联表。

这里是我试过到目前为止:

ColegioDBV2Entities db = new ColegioDBV2Entities(); 
public List<Student> FindAllStudentsFromGradeParalelo(int gradeParaleloId) 
{ 
    return (db.Students 
      .Include("GradeStudents") 
      .Include("GradeStudents.GradeParalelo") 
      .Where<Student>(s => s.StudentId == gradeParaleloId)).ToList(); 
} 

但它检索每一个gradeParalelo我选择一个学生。可以理解,因为我将一个StudentId与一个GradeParaleloId进行比较。 这不是我想要的。

任何人都可以提出一种方法来检索这个集合吗?

形象地说,我希望检索在与GradeParalelo ID 6

基本上这一点,GradeStudent表中的所有学生在一个更优雅的形式:

public List<Student> FindAllStudentsFromGradeParalelo(int gradeParaleloId) 
{ 
    List<Student> students = new List<Student>(); 

    using(GradeStudentRepository repo = new GradeStudentRepository()) 
    { 
     var items = repo.FindAllGradeStudents().Where(g => g.GradeParaleloId == gradeParaleloId); 

     StudentRepository studentRepo = new StudentRepository(); 
     foreach (var o in items) 
     { 
      students.Add(studentRepo.FindStudent(o.StudentId)); 
     } 
    } 

    return students; 
} 

回答

3

如何

return db.GradeParaleloes.Single(g => g.GradeParaleloId == gradeParaleloId) 
         .GradeStudents.Select(s => s.Student).ToList(); 
+0

我似乎无法调用.SelectMany方法,为什么? – 2011-04-11 13:53:20

+0

这似乎是完全错误的。单返回IQueryable和SelectMany仅适用于IEnumerable。 – 2011-04-11 14:01:01

+0

@Sergio:我的错。它现在应该工作。 – SLaks 2011-04-11 14:14:07

1

这是一个简单的查询,如:

return 
    db.Students 
     .Where(x => x.GradeParalelo.gradeParaleloId == gradeParaleloId) 
     .ToList(); 

如果您有FK权限,您只需调用FK并在内部链接所有需要的表格。

+0

是,将工作,但在关联表的额外列。我认为为了这个工作,你需要只有主键和两个表外键。 – 2011-04-11 13:51:30

+1

@Sergio:这应该没有什么区别。 – SLaks 2011-04-11 14:18:44

+0

@SLaks:我认为它的确如此,因为我现在拥有它,我不能说'x => x.GradeParalelo',但只有'x => x.GradeParaleloes'。 – 2011-04-11 16:37:48