gpt4 book ai didi

c# - API 调用获取记录后更新数据的最佳方式

转载 作者:行者123 更新时间:2023-11-30 15:58:54 25 4
gpt4 key购买 nike

我目前正在开发一个 API,其中一条记录只允许被拉取一次。它基本上是一个队列,一旦客户端拉取记录,记录上的 Retrieved 字段就会被标记为 true。 Get 调用仅提取 Retrieved 字段为假的记录。

Controller :

    [HttpGet]
public virtual IActionResult GetAll([FromQuery] int? limit)
{
try
{
return Ok(_repository.Get(limit));
}
catch
{
return new StatusCodeResult(StatusCodes.Status500InternalServerError);
}
}

存储库:

    public IQueryable<Report> Get(int? limit)
{
IQueryable<Report> reports;

if (limit == null)
{
reports = _context.Reports.Where(r => r.Retrieved == false);
}
else
{
reports = _context.Reports.Where(r => r.Retrieved == false).Take((int)limit);
}

return reports;
}

修改 Get 调用提取的记录的最佳方法是什么?如果我在从存储库代码返回结果之前进行修改,那么当 Controller 实际将 IQueryable 转换为真实数据时,该字段已更改并且不会提取任何结果,但 Controller 似乎是错误的地方这样做对数据库进行某种修改。

最佳答案

我会将此功能与检索分开。让调用者/客户指示报告已成功检索并通过第二次调用读取。这会增加一点开销,但它增加了弹性。示例:如果服务器调用后检索失败(可能在浏览器或客户端应用程序的网络中),则客户端有另一个机会检索数据。

Controller :

[HttpPut] 
public virtual async Task<IActionResult> MarkAsRetrieved(IEnumerable<int> reportIds, CancellationToken token)
{
await _repository.MarkRetrievedAsync(reportIds, token).ConfigureAwait(true);
return Ok();
}

存储库:

public Task MarkRetrievedAsync([FromBody]IEnumerable<int> reportIds, CancellationToken token)
{
foreach (Report report in reportIds.Select(x => new Report{ReportId = x, Retrieved = false}))
{
_context.Reports.Attach(report);
report.Retrieved = true;
}
return _context.SaveChangesAsync(token);
}

注意事项

  • 只需要发送Report 实例的标识符。然后,您可以附加一个具有相同标识符的空实例,并将 Retrieved 属性更新为 true,这将在相应的商店 update 中发送声明。

关于c# - API 调用获取记录后更新数据的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42515064/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com