在实体框架中以异步方式返回参与者人数

时间:2018-10-05 17:54:06

标签: c# entity-framework linq .net-core

我希望以JSON格式返回参与者人数。我下面有一个ParticipantRepository类:

public async Task<int> GetCountAllParticipants()
{
    return await context.Participants
    .CountAsync();
}

我的ParticipantsController类在下面:

[HttpGet("all/count")]
public JsonResult GetCountAllParticipants()
{
    return Json(repo.GetCountAllParticipants());
}

这在代码上没有错误,但是它返回了如下所示的自引用循环:

  

Newtonsoft.Json.JsonSerializationException:为类型为“ System.Runtime.CompilerServices.AsyncTaskMethodBuilder 1+AsyncStateMachineBox 1 [System.Int32,Restore.API.Repositories.ParticipantRepository.ParticipantRepository + d__15”的属性“ task”检测到自引用循环]”。路径'stateMachine。<> t__builder'。

当我如下修改存储库时:

public async Task<int> GetCountAllParticipants()
{
    return context.Participants.Count();
}

这次,我收到此错误:

  

此异步方法缺少“等待”运算符,将同步运行。考虑使用'await'操作符来等待非阻塞API调用,或使用'await Task.Run(...)'在后台线程上进行CPU绑定的工作

但是我有正确的返回JSON对象,如下所示:

{
    "result": 8,
    "id": 1,
    "exception": null,
    "status": 5,
    "isCanceled": false,
    "isCompleted": true,
    "isCompletedSuccessfully": true,
    "creationOptions": 0,
    "asyncState": null,
    "isFaulted": false
}

我可以这样使用它,但是我认为这不是正确的方法。如何返回参加人数?这样做的“正确”方法是什么?

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

必须等待整个链条。因此,您会这样做:

public async Task<int> GetCountAllParticipants()
{
    return await context.Participants.CountAsync();
}

[HttpGet("all/count")]
public async Task<JsonResult> GetCountAllParticipants()
{
    return Json(await repo.GetCountAllParticipants());
}

如果这是.NET Framework(而不是Core),那么您可能希望在async方法调用的末尾使用.ConfigureAwait(false),这样就不会在UI线程上强制它继续执行...。您不在乎语言/文化设置。

编辑:如果要返回您提到的特定json属性,则可以这样做:

[HttpGet("all/count")]
public async Task<JsonResult> GetCountAllParticipants()
{
    var count = await repo.GetCountAllParticipants()
    return Json(new { result = count });
}

但是,这会将其视为#,如果您希望将其作为“”(字符串),请执行以下操作:

[HttpGet("all/count")]
public async Task<JsonResult> GetCountAllParticipants()
{
    var count = await repo.GetCountAllParticipants()
    return Json(new { result = count.ToString() });
}

答案 1 :(得分:-1)

我认为这是重复的 https://stackoverflow.com/a/34501661/3623172

您使用ToListAsync()然后返回count()