C# 无法从存储库返回ASP.NET中查询的API数据
我试图从API返回JSON数据。 API端点为“/API/getUserSchedule(int-id)”。 它应该返回根据staffId值过滤的JSON数据,staffId值是taskSchedule表的外键 我可以使用不同的API端点返回所有数据,如图所示 但是,我需要它返回基于staffID的数据。 我创建了一个由存储库实现的接口 接口代码C# 无法从存储库返回ASP.NET中查询的API数据,c#,asp.net,task,C#,Asp.net,Task,我试图从API返回JSON数据。 API端点为“/API/getUserSchedule(int-id)”。 它应该返回根据staffId值过滤的JSON数据,staffId值是taskSchedule表的外键 我可以使用不同的API端点返回所有数据,如图所示 但是,我需要它返回基于staffID的数据。 我创建了一个由存储库实现的接口 接口代码 public interface ITaskScheduleRepository { Task<TaskSchedule> G
public interface ITaskScheduleRepository
{
Task<TaskSchedule> GetUserSchedule(int id);
}
公共接口ITaskScheduleRepository
{
任务GetUserSchedule(int-id);
}
存储库代码
public async Task<TaskSchedule> GetUserSchedule(int id)
{
var userTaskSchedule = await _context.TaskSchedules
.Where(s => s.staffId == id)
.ToListAsync();
return userTaskSchedule; // error is here
}
public异步任务GetUserSchedule(int-id)
{
var userTaskSchedule=await\u context.TaskSchedules
.其中(s=>s.staffId==id)
.ToListAsync();
return userTaskSchedule;//此处有错误
}
控制器代码
[HttpGet("{id}")]
public async Task<IActionResult> GetUserTaskSchedule(int id)
{
var taskUserSchedule = await _repo.GetUserSchedule(id);
if(taskUserSchedule != null)
return Ok(taskUserSchedule);
return BadRequest("There are no tasks for this user");
}
[HttpGet(“{id}”)]
公共异步任务GetUserTaskSchedule(int id)
{
var taskUserSchedule=wait _repo.GetUserSchedule(id);
if(taskUserSchedule!=null)
返回Ok(taskUserSchedule);
return BadRequest(“此用户没有任务”);
}
错误消息
无法隐式转换类型
'System.Collections.Generic.List'
至“Schedular.API.Models.TaskSchedule”[Schedular.API]csharp(CS0029)
您正试图返回一个
列表(请注意您在存储库方法中的.ToListAsync())调用),但您的接口被定义为返回一个任务计划。更新界面和存储库方法以返回列表
Task GetUserSchedule(int-id)代码>
及
public异步任务GetUserSchedule(int-id)
但是,如果员工只能有一个计划,请将存储库查询更改为返回单个项目,而不是项目列表
var userTaskSchedule = await _context.TaskSchedules
.Where(s => s.staffId == id)
.FirstOrDefaultAsync();
return userTaskSchedule; /
您需要1个TaskSchedule
实例,而不是ToListAsync
将返回的列表
改变
public async Task<TaskSchedule> GetUserSchedule(int id)
{
var userTaskSchedule = await _context.TaskSchedules
.Where(s => s.staffId == id)
.ToListAsync();
return userTaskSchedule;
}
public异步任务GetUserSchedule(int-id)
{
var userTaskSchedule=await\u context.TaskSchedules
.其中(s=>s.staffId==id)
.ToListAsync();
返回用户任务时间表;
}
对此
public Task<TaskSchedule> GetUserSchedule(int id)
{
return _context.TaskSchedules.SingleOrDefaultAsync(s => s.staffId == id);
}
公共任务GetUserSchedule(int-id)
{
返回_context.TaskSchedules.SingleOrDefaultAsync(s=>s.staffId==id);
}
注意,我删除了async/await
,因为这里不需要它。您可以直接返回调用方等待的任务
实例。如果需要在返回实例之前在此方法中对其执行某些操作,则可以在返回实例之前添加backasync/await
,并对其进行修改
如果返回任务,在方法名称中添加Async
作为后缀也是一种良好的做法。示例:GetUserScheduleAsync
而不是GetUserSchedule
您还可以使用FirstAsync
、FirstOrDefaultAsync
或SingleAsync
而不是SingleAsync
。哪一个取决于您在代码中的需求。var userTaskSchedule=wait\u context.TaskSchedules.SingleAsync(s=>s.staffId==id)代码>← 你想要的是1张,不是一张单子。非常感谢你,这就解决了我的问题。但是为什么我不需要将控制器从一个任务更新到另一个任务fwiw,我同意下面的@igor。这里函数的更好名称可能是类似于Task GetTaskSchedulesByStaffId(int-staffId)
。从长远来看,它使维护/记住哪些方法更容易!哦,要回答您的后续问题,这是因为您没有返回IActionResults
列表,只返回一个。您的IActionResult
是从任务计划列表中创建的单个JSON响应字符串:)谢谢,Igor,返回可能是一个列表,因为我的返回类型的员工可以有多个任务。Tommy的回答解决了我的问题,但知道如何处理单个任务返回很有趣。@GolfBravo然后我强烈建议您更改方法名和变量名,使它们不是单数而是复数。