#c# #async-await #asp.net-core-3.1
#c# #асинхронное ожидание #asp.net-core-3.1
Вопрос:
В ASP.NET В ядре 3.1 я пытаюсь сделать свои методы асинхронными.
Вот мой код:
public async Task<int> GetMaxNews()
{
return await _context.PNewses.MaxAsync(s => s.Id);
}
и я использую этот метод в этом фрагменте кода:
public async Task<List<PNews>> LastNews()
{
return await _context.PNewses.Where(s => s.Id == GetMaxNews()).ToList();
}
Я получаю эту ошибку:
Оператор ‘==’ не может быть применен к операндам типа ‘int’ и ‘Task’
Кто-нибудь может мне помочь? В чем проблема?
Комментарии:
1. На самом деле это не имеет особого смысла, по сути, вы пытаетесь вернуть список результатов с максимальным идентификатором. Идентификаторы обычно представляют собой кластеризованные и уникальные столбцы идентификаторов. В большинстве случаев будет только один. В каких случаях вы бы просто
OrderByDescending
тогдаFirstOrDefault
. если по какой-то странной причине вам это действительно нужно, было бы лучше сделать 2 обхода, получить максимальное значение, а затемwhere
по этому максимуму2. Как следует из сообщения об ошибке:
GetMaxNews()
возвращает aTask<int>
, который вам нужно будет каким-тоawait
образом получить в результатеint
…
Ответ №1:
Вы не можете вызвать другую функцию в EF, сначала получите результат ‘GetMaxNews’, а затем используйте его. как показано ниже в примере кода:
public async Task<int> GetMaxNews()
{
return await _context.PNewses.MaxAsync(s => s.Id);
}
public async Task<List<PNews>> LastNews()
{
int ResultOfGetMaxNews = await GetMaxNews();
return await _context.PNewses.Where(s => s.Id == ResultOfGetMaxNews ).ToListAsync();
}
Ответ №2:
При вызове GetMaxNews()
он возвращает a Task<Int>
. Когда вы ожидаете выполнения задачи, вы получаете обратно int. Хотите что-то похожее на это…
... Where(s => s.Id == await GetMaxNews()) ...
Комментарии:
1. общедоступная асинхронная задача<Список<PNews>> LastNews() { возвращает await _context . PNewses. Где ( s => s.Id == ожидание GetMaxNews()). ToList(); }