无法隐式转换类型“IEnumerable<T>”为“ActionResult<IEnumerable<T>>”。

5

我正在尝试从数据库获取条目列表,但是出现了错误。

无法隐式将类型“System.Collections.Generic.IEnumerable<models.DbModels.GrantProgram>”转换为“Microsoft.AspNetCore.Mvc.ActionResult<System.Collections.Generic.IEnumerable<models.DbModels.GrantProgram>>”[API]

请帮我。我该如何解决?

Controller.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(); 

Grants.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();
}

@The General 是的,我知道。我想学习三层架构。在这种情况下,我该如何解决这个问题? - StarLord
https://github.com/aspnet/Mvc/issues/7981 - mjwills
1
我猜你想要的代码应该是这样的:return new ActionResult<IEnumerable<GrantProgram>>(await _grants.GetGrants()); - mjwills
@mjwills 非常感谢!我的问题被某人关闭,称它是重复的。但是提到的问题答案并没有解决我的问题。但是你的解决方案起作用了! - StarLord
3个回答

6

我猜想你想要的代码是这样的

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

为什么现有的代码不能工作?因为(按照文档):

C#不支持接口的隐式转换操作符。

建议如下:

因此,将接口转换为具体类型是使用ActionResult所必需的。

这并不严格属实。是一个选项,是的(例如,调用ToList),但它并不是必要的。另一种选择(如我所示)是自己新建ActionResult而不依赖于隐式转换。
其他阅读:

1
使用 C# 9.0 的 目标类型的 new 表达式,现在你可以简化你的答案为 return new(await _grants.GetGrants()); - Marc Sigrist

3

既然您使用ActionResult,请考虑使用这个。

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

0
根据2022年2月发布的文档(ASP.NET Core Web API中的控制器操作返回类型),如果您的方法可能返回不同的ActionResults,请仅考虑使用ActionResult作为返回类型。由于此示例只有一条返回路径,因此您可以改用更简单的代码来定义特定类型作为返回值。以下是您的代码在进行此更改后的样子:

Controller.cs

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接