在异步方法.net core中返回元组结果

时间:2018-10-01 19:48:40

标签: c# asp.net asp.net-core

我有一个异步方法。该方法从数据库中获取10行的列表,并获取查询结果的总数。因为我正在使用网格分页。因此,我正在使用元组,其中一个元素是List,另一个元素是总数的计数。但是由于编译错误,我无法返回结果。我该怎么办?

public async Task<Tuple<List<IdNamePair>, int> GetStudents(QueryFilter queryObject)
{
    var query = studentEntity.Select(p => new IdNamePair
    {
        ID = p.ID.ToString(),
        Name = p.StudentNameSurname
    }).ToListAsync();

    int totalCount = await query.CountAsync();

    query = query.ApplyPaging(queryObject);//like Skip(20).Take(10)

    var students = query.ToListAsync();

    return await new Tuple<List<IdNamePair>, int>(students, totalCount); //ERROR
}

3 个答案:

答案 0 :(得分:3)

ToListAsync返回任务,将其删除以返回IQueryable

public async Task<Tuple<List<IdNamePair>, int>> GetStudents(QueryFilter queryObject)
{
    var query = studentEntity.Select(p => new IdNamePair
    {
        ID = p.ID.ToString(),
        Name = p.StudentNameSurname
    });

    int totalCount = await query.CountAsync();

    var students = await query.ApplyPaging(queryObject).ToListAsync();

    return new Tuple<List<IdNamePair>, int>(students, totalCount); 
}

答案 1 :(得分:2)

您在错误的陈述中使用了await关键字。此关键字仅与asynchronous方法调用一起使用。

具有给定返回类型的asyncawait的样本结构-

public async Task<Tuple<List<string>, int>> GetTupleResultAsync()
{
        List<string> listd = new List<string>() { "A", "A", "D", "E" };

        //Test code to await
        await Task.Run(() => "");

        return new Tuple<List<string>, int>(listd, listd.Count);
}

尝试以下修改后的代码-

public async Task<Tuple<List<IdNamePair>>, int> GetStudents(QueryFilter queryObject)
{
  var query = studentEntity.Select(p => new IdNamePair
  {
    ID = p.ID.ToString(),
    Name = p.StudentNameSurname
  });

  int totalCount = await query.CountAsync();

  query = query.ApplyPaging(queryObject);//like Skip(20).Take(10)

  var students = await query.ToListAsync();

  return new Tuple<List<IdNamePair>, int>(students, totalCount); //ERROR
}

答案 2 :(得分:2)

您在这里有一些小错误。

首先,返回类型,int在元组外部声明。将其添加到里面。

然后,您已经混合了await关键字。在您要等待异步操作完成的地方使用它。

尝试一下

public async Task<Tuple<List<IdNamePair>, int>> GetStudents(QueryFilter queryObject)
{
    var query = studentEntity.Select(p => new IdNamePair
    {
        ID = p.ID.ToString(),
        Name = p.StudentNameSurname
    });

    int totalCount = await query.CountAsync();

    query = query.ApplyPaging(queryObject);//like Skip(20).Take(10)

    var students = await query.ToListAsync();

    return new Tuple<List<IdNamePair>, int>(students, totalCount);
}

额外1 :您还可以在此处使用较短的元组声明

public async Task<(List<IdNamePair>, int)> GetStudents()
{
    ...
    return (students, totalCount);
}

附加2 :在C#7中,您还可以命名元组项,从而使方法的使用者更加清楚

public async Task<(List<IdNamePair> Students, int TotalCount)> GetStudents()
{
    ...
    return (students, totalCount);
}