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

rea*_*ist 4 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
}
Run Code Online (Sandbox Code Playgroud)

Fab*_*bio 7

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); 
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*und 6

你在这里有一些小错误。

首先是返回类型,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);
}
Run Code Online (Sandbox Code Playgroud)

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

public async Task<(List<IdNamePair>, int)> GetStudents()
{
    ...
    return (students, totalCount);
}
Run Code Online (Sandbox Code Playgroud)

额外 2:在 C# 7 中,您还可以命名元组项,这使方法的使用者更加清晰

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