【问题标题】:Cannot implicitly convert type 'System.Collections.Generic.List<<anonymous type>>' to 'System.Collections.Generic.List<string>'无法将类型“System.Collections.Generic.List<<anonymous type>>”隐式转换为“System.Collections.Generic.List<string>”
【发布时间】:2017-05-14 08:25:10
【问题描述】:

我的代码应该检查两个条件并返回值,但是当我尝试返回 q 时出现此错误

无法将类型'System.Collections.Generic.List>'隐式转换为'System.Collections.Generic.List

我尝试了所有方法但没有任何效果也不知道设置List&lt;string&gt; 或设置为List&lt;EF_Model.PDF&gt;,PDF 是我模型中的 DTO

这是我的代码

  internal List<string> Customers_File(int _id)
    {
        using (var Context = new EF_Model.CoolerEntities())
        {
            var q = from c in Context.Customers
                    where c.Id == _id &&
                    c.Ref_PDF != null
                    select new { c.PDF.Name, c.PDF.File };
            return q.ToList();
        }
    }

【问题讨论】:

  • 错误信息的哪一部分告诉你到底出了什么问题你不明白?
  • 你可以使用:select new string[] { c.PDF.Name, c.PDF.File };
  • 那么您希望实际上从您的方法返回什么 - 字符串列表或 PDF 名称和文件列表?
  • 我可以看到您拥有哪些字段,并且我知道您希望它“正常工作” - 但不清楚您想做什么!
  • 我想从 DB @Jamiec 获取这两个值

标签: c# linq generics


【解决方案1】:

您必须将匿名对象转换为字符串表示形式。(注意我使用的是 C# 6.0 功能 - 字符串插值,您可以将其替换为之前版本中的 string.Format。 示例:

return q.Select(x=>$"Name = {x.PDF.Name} File = {c.PDF.File}").ToList();

【讨论】:

    【解决方案2】:

    您已将返回类型声明为字符串,但返回的是具有两个属性的匿名对象列表。那是行不通的。如果要返回一个字符串,则需要为每个列表项创建一个字符串。如果要返回对象,请更改返回类型

    【讨论】:

      【解决方案3】:

      您收到此错误是因为您已将 Customers_File 定义为返回字符串列表。但是,您返回的列表 q 不符合该描述。

      在您的查询中,当您这样做时

      select new { c.PDF.Name, c.PDF.File };
      

      ..您正在创建一个Anonymous Type,并将其存储在集合q 中。这种类型有两个字段,显然不是string

      一些可能的解决方案是:

      • 将您的方法更改为返回类型为List&lt;object&gt; 而不是List&lt;string&gt;(不推荐)。
      • 通过某种形式的序列化(JSON 或 XML)将您的对象变成一个字符串。
      • 为此数据创建一个类或结构并将方法的返回类型更改为List&lt;dataClass&gt;

      【讨论】:

      • 更改为 List 不是一个好主意。如果是匿名类型,以后想怎么用?
      • 不,最好的解决方案是首先不使用匿名类型。但是,List&lt;object&gt; 仍然是一个可能的解决方案。
      • 对我来说,这不是一个解决方案,而是一种让您的项目可构建的方法;)
      【解决方案4】:

      你需要用你的 to 属性定义一个对象

      public class PdfInfo
      {
          public string Name{get;set;}
          public string File{get;set;}
      }
      

      从您的方法中返回它们的列表

      internal List<PdfInfo> Customers_File(int _id)
      

      最后投影到那些,代替匿名对象:

      ....
      select new PdfInfo() { Name=c.PDF.Name, File = c.PDF.File };
      

      【讨论】:

      • 得到这个错误>不能用集合初始化器初始化类型'PDF',因为它没有在这里实现'System.Collections.IEnumerable'{ Name=c.PDF.Name, File = c.PDF.File };
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-17
      相关资源
      最近更新 更多