вернуть кортеж в асинхронный метод .net core - PullRequest
0 голосов
/ 01 октября 2018

У меня есть асинхронный метод.Этот метод получает список из 10 строк из базы данных и получает общее количество результатов запроса.Потому что я использую для нумерации страниц.Итак, я использую кортеж, один элемент которого является списком, а другой - счетчиком общего числа.Но я не могу вернуть результат из-за ошибки компиляции.Как я могу это сделать?

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 голосов
/ 01 октября 2018

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); 
}
0 голосов
/ 01 октября 2018

У вас есть небольшие ошибки.

Первый , тип возвращаемого значения, 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);
}

Extra 1 : здесь вы также можете использовать более короткое объявление кортежа

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

Extra 2 : в C # 7 вы также можете назвать элементы кортежа, что даст потребителю больше ясности в методе

public async Task<(List<IdNamePair> Students, int TotalCount)> GetStudents()
{
    ...
    return (students, totalCount);
}
0 голосов
/ 01 октября 2018

Вы использовали ключевое слово 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...