1

我有两个要使用谓词生成器加入的表。在伪代码中,我想返回所有 StudentSchedule 行,在 StudentId 上加入 Student,其中 StudentLastName = "Smith"。

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

我可以为一个实体做这件事就好了-

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 回答