Асинхронное сохранение / возврат списка в хранилище - PullRequest
0 голосов
/ 29 ноября 2018

Я работаю над WebAPI в .NET Core, для доступа к БД у меня есть реализация шаблона синхронного репозитория.Сейчас я меняю подход с синхронного на асинхронный и столкнулся с парой проблем, которые мне не понятны.

У меня есть эта функция:

public List<object> Save(List<T> entities)
    {
        return entities.Select(x => _session.Save(x)).ToList();
    }

Как сделать это асинхронным?

Вторая функция:

 public async Task<List<Comment>> GetCommentsForPost(long postId)
    {
        try
        {
            return await (List<Comment>)_session.QueryOver<Comment>()
            .Where(x => x.PostId.Id == postId && !x.Deleted)
            .OrderBy(x => x.Created).Desc
            .ListAsync().Result;
        }
        catch (Exception e)
        {
            logger.Error(e.Message + e.InnerException + e.StackTrace);
            return null;
        }          
    }

Эти две функции не связаны.Я положил их, чтобы я мог показать, где у меня проблемы.Как видите, я пытаюсь заставить его работать во второй функции.Все проблемы, с которыми я сталкиваюсь, приводят к одной и той же ошибке: «... не содержит определения для GetAwaiter () и нет доступного метода расширения GetAwaiter (), принимающего ...»

Может кто-нибудь показать мне, как этодолжно быть сделано правильно?

РЕДАКТИРОВАТЬ: Это то, что я нашел, что работает:

var t = entities.Select(async x => await _session.SaveAsync(x)).ToList();
        await Task.WhenAll(t);
        return t;

Однако я не уверен, что это хороший подход?

1 Ответ

0 голосов
/ 29 ноября 2018

Функция 1:

public async Task<List<object>> Save(List<T> entities)
{
    return await entities.Select(x => _session.Save(x)).ToListAsync();
}

Функция 2: просто удалить .Result;.

...