【问题标题】:cannot implicitly convert type system.collections.generic.list to system.collections.generic.IEnumerable [closed]无法将类型 system.collections.generic.list 隐式转换为 system.collections.generic.IEnumerable [关闭]
【发布时间】:2021-09-07 20:51:39
【问题描述】:

我很难理解为什么这个查询不起作用。类似的查询在不使用Select 时工作得很好,但是当我使用Select 时没有任何工作:

[HttpGet]
public IEnumerable<Books> Get()
{
     using(var context = new SchoolContext())
     {
          return context.Books.Select(s => new { s.Boknummer, s.Arstall}).ToList();
     }    
}

【问题讨论】:

  • new { s.Booknummer, s.Arstall } 是什么让你认为这是Book?
  • 为什么不使用return context.Books.ToList();?
  • 正如 mjwills 所说,您的方法的返回类型定义为 IEnumerable,但您正试图返回一个匿名对象列表。
  • 你一直提到你想选择特定的行,但是在你的代码中你选择了特定的列。你真正想要什么?
  • @Orion,对于不一致之处,我们深表歉意。我现在明白了。这是我第一次使用#C 和 API.net core web api。我对这一切都很陌生。

标签: c# asp.net linq


【解决方案1】:

如果你想用一个大类的几个字段返回强类型值,你需要创建一个 ViewModel 类。

您告诉您的代码,您的控制器操作期望返回 List&lt;Book&gt;,但您提供的是由 LINQ 构建的匿名对象。当您执行Select(s =&gt; new {}) 时,代码没有适合此内容的类型,因此它被视为匿名类型。

要达到预期结果,请执行以下操作

创建一个 ViewModel 用于输入您的回报

public class BooksLightViewModel
{
   public string Boknummer { get; set; }
   public string Arstall { get; set; }
}

然后像这样编写你的控制器动作

[HttpGet]

public IEnumerable<BooksLightViewModel> Get()
{
    using(var context = new SchoolContext())
    {
        return context.Books.Select(s => new BooksLightViewModel { 
                                                      Boknummer = s.Boknummer, 
                                                      Arstall = s.Arstall
                                                  }).ToList();
    }    
 }

【讨论】:

  • 非常感谢您的帮助!现在我明白了很多。我真的很喜欢这个。
  • @name,将此答案标记为问题答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-14
  • 1970-01-01
  • 1970-01-01
  • 2015-08-04
  • 1970-01-01
  • 1970-01-01
  • 2019-01-18
相关资源
最近更新 更多