1

述語ビルダーを使用して結合したい 2 つのテーブルがあります。疑似コードでは、StudentLastName = "Smith" である StudentId で Student と結合して、すべての StudentSchedule 行を返したいと考えています。

public class Student
{
    int StudentId {get;set;}
    string StudentFirstName {get;set;}
    string StudentLastName {get;set;}
}
class StudentSchedule
{
    int StudentScheduleId
    int StudentId
    string ClassName
}

1つのエンティティに対しては問題なく実行できます-

var studentBuilder = PredicateBuilder.True<Student>();

studentBuilder = studentBuilder.And(Student => Student.StudentId == studentId);

var students = context.Students.Where(studentBuilder).ToList();
4

1 に答える 1

2

次に、モデルを次のように変更する必要があります。

public class Student
{
    public int StudentId {get;set;}
    public string StudentFirstName {get;set;}
    public string StudentLastName {get;set;}
    public virtual ICollection<StudentSchedule> StudentSchedules {get;set;}
}
class StudentSchedule
{
    public int StudentScheduleId {get;set;}
    public int StudentId {get;set;}
    public string ClassName {get;set;}
    public virtual Student Student {get;set;}
}

次に、クエリは次のようになります。

var students = db.Students
  .Include(s=>s.StudentSchedules)
  .Where(studentBuilder)
  .ToList();

述語ビルダーなし:

var students = db.Students
  .Include(s=>s.StudentSchedules)
  .Where(s=>s.StudentLastName == "Smith")
  .ToList();

私の個人的な好みは、それが外部プロパティでない限り、プロパティでエンティティ タイプを繰り返さないことです。そのため、私のモデルは次のようになります。

public class Student
{
    public int Id {get;set;}
    public string FirstName {get;set;}
    public string LastName {get;set;}
    public virtual ICollection<StudentSchedule> Schedules {get;set;}
}
class StudentSchedule
{
    public int Id {get;set;}
    public int StudentId {get;set;}
    public string ClassName {get;set;}
    public virtual Student Student {get;set;}
}

もちろん、「サブジェクト」(名前、前提条件など)、「クラス」(サブジェクト、教室、スケジュール、スタッフ)、「学生」(名、姓、クラス)、「スタッフ」を含む、より詳細なモデルが必要になる場合があります。 " (FirstName、LastName、JobTitle、Classes) および "Schedules" (曜日、開始時刻、終了時刻、Classes)。

于 2017-09-01T16:40:25.937 に答える