我已经实现了一个由两个实体Student和Department组成的核心Web api,并实现了一个部门可以拥有多个学生的一对多关系。我创建了一个名为DepartmentStudentsResponse的响应模型,如下所示。
1)我要实现GetStudents(int id)方法,在该方法中将提供特定的部门ID,并且应该返回其中包含listOfstudents的部门。
2)在GetStudents(int id)方法中,departmentStudents.department = department.Result;
,departmentStudents.students = listOfStudents.Result;
为什么我们需要.Result
?没有.Result
,我该如何实施?
DeparmentController.cs GetStudents(int id)
HttpGet("{id}")]
// [Route("DepartmentWithStudent")]
public async Task<ActionResult<Student>> GetStudents(int id)
{
DepartmentStudentsResponse departmentStudents = new DepartmentStudentsResponse();
var department = _context.Departments.FindAsync(id);
if (department != null)
{
departmentStudents.department = department.Result;
var listOfStudents = _context.Students.Where(x => x.DepartmentId == id).ToListAsync();
departmentStudents.students = listOfStudents.Result;
//return departmentStudents;
}
else
{
return NotFound();
}
}
DepartmentStudentsResponse.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace Students.Models
{
public class DepartmentStudentsResponse
{
public Department department { get; set; }
public List<Student> students { get; set; }
}
}
您不需要使用.Result
与.Result
之类的阻塞调用混合异步等待会导致死锁。这些异步调用应等待。
到目前为止,满足您要求的所有内容都显示在所示方法中。需要进行一些更改才能使其正常运行。
HttpGet("{id:int}")]
public async Task<ActionResult<DepartmentStudentsResponse>> GetStudents(int id) {
DepartmentStudentsResponse departmentStudents = new DepartmentStudentsResponse();
var department = await _context.Departments.FindAsync(id);
if (department != null) {
departmentStudents.department = department;
var listOfStudents = await _context.Students.Where(x => x.DepartmentId == id).ToListAsync();
departmentStudents.students = listOfStudents;
return departmentStudents;
} else {
return NotFound();
}
}