我有一个异步方法。该方法从数据库中获取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
}
答案 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
方法调用一起使用。
具有给定返回类型的async
和await
的样本结构-
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);
}