C# 错误:“无法隐式转换类型”

C# 错误:“无法隐式转换类型”,c#,linq,asp.net-web-api2,C#,Linq,Asp.net Web Api2,我正在做一个项目,我有一个关于转换类型的问题。我想为我的项目创建简单搜索,但它无法返回带有以下消息的结果: 错误1无法将类型“System.Collections.Generic.List”隐式转换为“EmployeeDataAccess.TimeWorkMonthly” 方法的返回类型为TimeWorkMonthly,但在方法体返回列表中 你也应该 将方法返回类型更改为IEnumerable 您可以使用List,但出于许多原因,使用接口来抽象集合类型更好 如果您的目标是只返回一个元素,并且不关

我正在做一个项目,我有一个关于转换类型的问题。我想为我的项目创建简单搜索,但它无法返回带有以下消息的结果:

错误1无法将类型“System.Collections.Generic.List”隐式转换为“EmployeeDataAccess.TimeWorkMonthly”


方法的返回类型为TimeWorkMonthly,但在方法体返回列表中

你也应该

将方法返回类型更改为IEnumerable 您可以使用List,但出于许多原因,使用接口来抽象集合类型更好 如果您的目标是只返回一个元素,并且不关心除第一个元素以外的任何内容,请使用FirstOrDefault、First、SingleOrDefault或Single 哪种方法更好取决于您的数据和搜索条件,即您是否希望此ID是唯一的

从语义上看,这看起来像是在做一种类似ID的查找,所以我猜应该是解决方案2,并使用Single或SingleOrDefault

最后一个选择是,如果ID找不到任何内容,您希望程序如何运行

如果您想要异常,请使用Single 如果需要空值,请使用SingleOrDefault 总之,您所要做的就是将最后一行代码更改为

返回结果。单个


当然,在此之前不需要调用ToList,方法签名表明只需要返回单个对象。但您返回的是一个对象列表。当您只想返回一个对象时,使用.ToList是不合适的。有四种适当的扩展方法:

-将返回集合中的第一项,如果集合为空,则引发异常

-将返回集合中的第一项,如果集合为空,则返回类型的默认值

-如果集合中有一个项目,它将返回该项目。如果集合中没有项,则引发异常。如果集合中有多个项,则会引发异常

-如果集合中有一个项目,它将返回该项目。如果集合中没有项目,它将返回类型的默认值。如果集合中有多个项,则会引发异常

因为您是按ID搜索的,所以您可能永远不会期望匹配两个或多个元素。所以排除了First和FirstOrDefault。如果找不到具有匹配ID的项,则应根据您希望的行为使用Single或SingleOrDefault

public TimeWorkMonthly Get(int id)
{
    using (EmployeeDbEntities Entities = new EmployeeDbEntities())
    {
        var result = Entities.TimeWorkMonthlies.Where(e => e.KartNo == id).Single();
        return result;
    }
}

注意,我删除了persons变量,因为您从未对它做过任何操作。而且,您对.Select扩展方法的使用非常出色,因为您刚刚选择了已经被迭代的同一个对象。选择用于变换对象的时间。

问题仅在于您的qry。如果你想用Tolist函数转换它,你必须改变你的qry

像这样

public TimeWorkMonthly Get(int id)
{
    using (EmployeeDbEntities Entities = new EmployeeDbEntities())
        {

            var result = from x in Entities.TimeWorkMonthlies
                                 Where x.KartNo == id
                                 Select x;

            return result.ToList();
        }
}

现在,您可以将它转换为列表,并根据需要使用它。

您返回的是列表,而不是单个对象。为什么要列出人员=新列表;?它一点作用也没有。为什么要使用.Selecte=>e?它一点作用也没有。你为什么使用。托利斯;两次第二次它什么也没做。有人想知道,您是否在不理解代码的情况下编写或复制了该代码。永远不要使用你不懂的代码。我是一个初学者,我不明白这些参数的确切区别。我想看到很多行。您的第一个解决方案是正确的,而且有效!谢谢,如果签名承诺为单个对象,您仍然无法返回列表。上面的示例能够将qry转换为列表。在此之后,您可以将函数的返回类型更改为列表
public TimeWorkMonthly Get(int id)
{
    using (EmployeeDbEntities Entities = new EmployeeDbEntities())
        {

            var result = from x in Entities.TimeWorkMonthlies
                                 Where x.KartNo == id
                                 Select x;

            return result.ToList();
        }
}