Невозможно неявно преобразовать тип «IEnumerable‹T›» в «ActionResult‹IEnumerable‹T››»

Я пытаюсь получить список записей из базы данных. Но я получаю сообщение об ошибке.

Невозможно неявно преобразовать тип «System.Collections.Generic.IEnumerable‹models.DbModels.GrantProgram›» в «Microsoft.AspNetCore.Mvc.ActionResult‹System.Collections.Generic.IEnumerable‹models.DbModels.GrantProgram›» [API]

Помогите мне, пожалуйста. Как я могу это решить?

Контроллер.cs

public async Task<ActionResult<IEnumerable<GrantProgram>>> GetGrants()
{
  //This is where the error is showing. 
  return await _grants.GetGrants(); 
}

Бизнес-уровень

IGrants.cs

Task<IEnumerable<GrantProgram>> GetGrants(); 

Гранты.cs

public async Task<IEnumerable<GrantProgram>> GetGrants()
{
    return await _grantRepository.GetGrants(); 
}

Уровень доступа к данным

IGrantsRepository.cs

Task<IEnumerable<GrantProgram>> GetGrants(); 

GrantsRepository.cs

public async Task<IEnumerable<GrantProgram>> GetGrants()
{
    return await _context.GrantProgram.ToListAsync();
}

person StarLord    schedule 18.12.2020    source источник
comment
@Генерал Да, я знаю это. Я хотел изучить трехслойную архитектуру. Как я могу решить эту проблему в этом сценарии?   -  person StarLord    schedule 18.12.2020
comment
github.com/aspnet/Mvc/issues/7981   -  person mjwills    schedule 18.12.2020
comment
Я подозреваю, что код, который вы хотите, что-то вроде return new ActionResult<IEnumerable<GrantProgram>>(await _grants.GetGrants());   -  person mjwills    schedule 18.12.2020
comment
@mjwills Большое спасибо! Мой вопрос был закрыт кем-то, кто сказал, что это дубликат. Но ответ на упомянутый вопрос не решил мою проблему. Но ваше решение сработало!   -  person StarLord    schedule 18.12.2020


Ответы (1)


Я подозреваю, что код, который вы хотите, похож на

return new ActionResult<IEnumerable<GrantProgram>>(await _grants.GetGrants());

Почему ваш существующий код не работает? Потому что (согласно документация):

C# не поддерживает неявные операторы приведения в интерфейсах.

Он предлагает:

Следовательно, для использования ActionResult необходимо преобразование интерфейса в конкретный тип.

что, строго говоря, не соответствует действительности. Да, это опция (например, вызов ToList), но это не обязательно. Другой вариант (как я показываю) — new поднять ActionResult самостоятельно, а не полагаться на неявное преобразование).

Другое чтение:

person mjwills    schedule 18.12.2020