无法隐式转换类型 'System.Collections.Generic.List<<匿名类型>>' 为 'System.Collections.Generic.List<string>'。

5
我的代码应该检查两个条件并返回值,但当我尝试返回 q 时,会出现以下错误:

无法隐式转换类型'System.Collections.Generic.List<< anonymous type: string Name, string File>>'到'System.Collections.Generic.List< string>

我尝试了一切方法,但仍然没有解决,也不知道如何设置List<string>或将其设置为List<EF_Model.PDF>,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();
        }
    }

1
错误信息中哪一部分告诉了你出了什么问题,你不理解? - Jens
你可以使用:select new string[] { c.PDF.Name, c.PDF.File }; - jdweng
那么你实际上想从你的方法中返回什么 - 一个字符串列表还是一个PDF名称和文件的列表? - Jamiec
我可以看到你有哪些字段,我知道你希望它“只是工作” - 但不清楚你想做什么! - Jamiec
我想从数据库中获取这两个值 @Jamiec - Mostafa Bouzari
4个回答

3
你需要将匿名对象转换为字符串表示形式。(注意我使用了C# 6.0的特性 - 字符串插值,如果您使用早期版本可以使用string.Format替代。 示例:
return q.Select(x=>$"Name = {x.PDF.Name} File = {c.PDF.File}").ToList();

哦! 你必须将其转换为显式字符串! 有趣。 - tisaconundrum

1
你需要定义一个带有两个属性的对象。
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 }; - Mostafa Bouzari

0
你已经将返回类型声明为字符串,但是却返回了一个具有两个属性的匿名对象列表。这样是行不通的。如果你想返回一个字符串,你需要为每个列表项创建一个单独的字符串。如果你想返回对象,请更改你的返回类型。

0
您之所以会收到此错误,是因为您已将Customers_File定义为返回字符串列表。然而,您返回的列表q并不符合该描述。
在查询中,当您执行以下操作时:
select new { c.PDF.Name, c.PDF.File };

..你正在创建一个匿名类型,并将其存储在集合q中。该类型有两个字段,显然不是string

一些可能的解决方案包括:

  • 将您的方法更改为返回类型为List<object>而不是List<string>(不建议)。
  • 通过某种形式的序列化(JSON或XML)将您的对象转换为字符串。
  • 为此数据创建一个类或结构,并将您的方法的返回类型更改为List<dataClass>

2
更改为List<object>不是一个好主意。如果它是匿名类型,那么你以后想如何使用它? - MistyK
好吧,最好的解决方案是一开始就不要使用匿名类型。然而,List<object>仍然是一个可能的解决方案。 - stelioslogothetis
对我来说,这不是一个解决方案,而是使您的项目可构建的一种方式 ;) - MistyK

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