首页 > 解决方案 > 如何根据我的 API 中的两个不同 ID 获得响应?

问题描述

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 的初学者,所以如果我需要添加更多上下文,请告诉我。

标签: entity-frameworkapi

解决方案


如果您想通过StudentId或进行查询TermId,我建议您为这两个不同的查询提供两个不同的端点。使用 LINQWhere检查您的条件。

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引入一个查询对象来封装你的参数。Where您可以使用 AND 测试子句中的多个条件&&

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; }
}

推荐阅读