如何在我的API中基于两个不同的ID获得响应?

时间:2018-11-15 08:29:37

标签: entity-framework api

public class Report
{
    [Key]
    public int ReportId { get; set; }

    [ForeignKey("Subjects")]
    public int SubjectId { get; set; }
    public Subjects Subjects { get; set; }

    [ForeignKey("Teacher")]
    public int TeacherId { get; set; }
    public Teacher Teacher { get; set; }

   [ForeignKey("MarkType")]
    public int MarkTypeId { get; set; }
    public MarkType MarkType { get; set; }
}

public class Teacher
{
    [Key]
    public int TeacherId { get; set; }

    [MaxLength(50)]
    [Required]
    public string FName { get; set; }

    [MaxLength(50)]
    [Required]
    public string LName { get; set; }

}

public class Student
{
    [Key]
    public int StudentId { get; set; }

    [MaxLength(50)]
    [Required]
    public string FName { get; set; }

    [MaxLength(50)]
    [Required]
    public string LName { get; set; }

    [ForeignKey("Grade")]
    public int GradeId { get; set; }
    public Grade Grade { get; set; }
}

public class Grade
{
    [Key]
    public int GradeId { get; set; }
    public int StudentGrade { get; set; }
}

public class Subjects
{
    [Key]
    public int SubjectId { get; set; }

    [MaxLength(50)]
    [Required]
    public string SubjectName { get; set; }
}

public class Terms
{
    [Key]
    public int TermId { get; set; }

    public int Term { get; set; }
}

public class MarkType
{
    [Key]
    public int MarkTypeId { get; set; }
    [MaxLength(20)]
    [Required]
    public string TypeName { get; set; }

}

public class StudentMark
{
    [Key]
    public int StudentMarkId { get; set; }

    [ForeignKey("Report")]
    public int ReportId { get; set; }
    public Report Report { get; set; }

    [ForeignKey("Student")]
    public int StudentId { get; set; }
    public Student Student { get; set; }

    public int Mark { get; set; }

    [ForeignKey("Terms")]
    public int TermId { get; set; }
    public Terms Terms { get; set; }

}

在API中,我希望能够使用两个不同的ID来获得更具体的响应。

var report = ReportDBContext.StudentMark
            .Include(p => p.Student.Grade).Include(p => p.Report)
            .Include(p => p.Terms).Include(a => a.Report.Subjects).Include(a => a.Terms)
            .Include(a => a.Report.MarkType).Include(a => a.Report.Teacher).ToList();

这使我能够获得StudentMark及其相关实体,但我希望能够使用“学生ID”和“学期ID”来获得该学期以及与该学生相关的所有学科的学生分数。我是Web API的初学者,因此,如果需要添加更多上下文,请告诉我。

1 个答案:

答案 0 :(得分:0)

如果要通过StudentIdTermId进行查询,建议您为这两个不同的查询提供两个不同的端点。使用LINQ Where检查您的状况。

public StudentMark[] GetMarksByStudentId(int studentId) {
    return ReportDBContext.StudentMark
        /* .Include(...) */
        .Where(mark => mark.StudentId == studentId)
        .ToArray();
}

public StudentMark[] GetMarksByTermId(int termId) {
    return ReportDBContext.StudentMark
        /* .Include(...) */
        .Where(mark => mark.TermId == termId)
        .ToArray();
}

如果要同时通过StudentIdTermId进行查询,请引入查询对象以封装参数。您可以使用AND Where&&子句中测试多个条件。

public StudentMark[] FindMarks(StudentMarkQuery query) {
     return ReportDBContext.StudentMark
            /* .Include(...) */
            .Where(mark => mark.StudentId == query.StudentId
                        && mark.TermId == query.TermId)
            .ToArray();
}

引入了StudentMarkQuery类,因此您可以添加其他参数而无需更改端点的整体签名:

public class StudentMarkQuery {
    public int StudentId { get; set; }
    public int TermId { get; set; }
}