1対多リレーションシップに適切なエンティティフレームワーククラス定義を使用した場合、クエリははるかに簡単になります。 Entity Frameworkはこれを行うため、結合を使用する必要はありません。
class Teacher
{
public int Id {get; set;}
// a Teacher has zero or more Students:
public virtual ICollection<Student> Students {get; set;}
...
}
class Student
{
public int Id {get; set;}
// a Student has exactly one Teacher, via foreign key TeacherId
public int TeacherId {get; set;}
public virtual Teacher Teacher {get; set;}
...
}
class MyDbContext : DbContext
{
public DbSet<Teacher> Teachers {get; set;}
public DbSet<Student> Students {get; set;}
}
適切Code First Conventionsが使用されているので、:1教師がゼロ以上の学生を持っており、すべての学生は、次のように正確に一つの教師、1対多のがモデル化されている場合は
はEntity Framework Configure One-to-Many Relationship
を見ますこれは教師と生徒の間の一対一の関係をモデル化するために必要なすべてです。
異なるテーブル名や列名が必要な場合は、属性や流暢なAPIを使用する必要がありますが、Idは同じままです。教師には多くの生徒のICollectionがあり、生徒には外国人の鍵とそれに付随する教師の財産。
モデルが正しくクエリがはるかに簡単になります定義した:
var result = myDbContext.Teachers // from the set of Teachers
.Where(teacher => teacher.TypeId == 2) // take all teachers with TypeId 2
.Select(teacher => new Test() // from every remaining Teacher,
{ // create one Test object
Id = teacher.Id, // With Id is Teach Id
Text = teacher.Text, // Text is teacher.Text
Students = teacher.Students
.Select(student => new StudentDTO() // from every Student of this Teacher
{ // create a StudentDTO object
Id = student.ID, // with Id = student.Id
Name= student.Name, // Name is student.Name
})
.ToList(), // create a list of these StudentDTOs
})
.ToList(); // create a list of all Test objects
私の経験は、私が正しく、すべての私のEntity Frameworkのクラスをモデル化するので、私はめったにもう参加を作成する必要がないということです。私は通常、結合されたテーブルの代わりにコレクションで考える。 Entity Frameworkは、内部的に結合を実行するタイミングを認識します。例えば
:あなたがしたい場合は、特定のTeacherCodeと教師のすべての生徒の名前:
IEnumerable<Student> GetStudentsOfTeacher(string teacherCode)
{
return myDbContext.Students
.Where(student => student.Teacher.TeacherCode == teacherCode);
}
Entity FrameworkのはあなたのためにTeacherIdの生徒と教師の参加を行います。
より簡単なlinqクエリとは別に、適切なモデリングによって、データベースのモデリング方法も隠されます。内部モデルが変更された場合、dbContextのユーザはコードを変更する必要はありません。
たとえば、教師と生徒の関係を多対多の関係に変更すると、教師には生徒が多く、生徒には多くの生徒がいる可能性があるため、生徒のクラスの定義は変更されず、したがって、クラスが変更されない限り、上記のクエリは変更する必要はありません。
どのようなエラーが表示されますか? – Maxime
1つの教師レコードの2つの一致するレコードが生徒テーブルにある場合、そのオブジェクトの生徒レコードの収集が得られません。 test.csには{id、text、Students count 2}が必要です。 – PRK
あなたはあなたが望むことをするために "グループ化"が必要なようです。 –