Error: “Cannot implicitly convert type”

Error: “Cannot implicitly convert type”

我正在做一个项目,我对转换类型有疑问。我想为我的项目创建简单的搜索,但它无法 return 结果显示此消息:

Error 1 Cannot implicitly convert type 'System.Collections.Generic.List' to 'EmployeeDataAccess.TimeWorkMonthly'

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

你的方法的return类型是TimeWorkMonthlies但是在方法体内returnList<TimeWorkMonthlies>

你应该

  1. 将您的方法 return 类型更改为 IEnumerable<TimeWorkMonthlies> (您可以使用 List<TimeWorkMonthlies> 但出于多种原因,使用接口来抽象集合类型更好)
  2. 使用 FirstOrDefaultFirstSingleOrDefaultSingle extension methods of IEnumerable 如果您的目标是 return 只有 元素,除了第一个元素你什么都不关心

哪种方法更好取决于您的数据和搜索条件 - 即 您是否希望此 ID 是唯一的。

从你的语义来看,你似乎在做某种类似于 ID 查找的 repository,所以我猜是解决方案 2) 并使用 SingleSingleOrDefault

如果 ID

未找到任何内容,最后的选择是您希望程序如何运行
  1. 如果您想要例外,请使用 Single
  2. 如果你想要 null 使用 SingleOrDefault

总而言之,您只需将最后一行代码更改为

return result.Single();

(当然,您不需要在此之前调用 ToList()

您的方法签名表明您只想 return 一个 object。但是您正在 returning 一个 object 的列表。当您只想 return 一个 object 时,使用 .ToList() 是不合适的。有四种合适的扩展方式:

First - 将 return 来自 collection 的第一项,如果 collection 为空则抛出异常。

FirstOrDefault - 将 return 作为 collection 中的第一项,如果 collection 为空,则为默认类型。

Single - 如果 collection 中有一项,它将 return 它。如果 collection 中没有项目,则会抛出异常。如果 collection 中有多个项目,则抛出异常。

SingleOrDefault - 如果 collection 中有一项,它将 return 它。如果 collection 中没有项目,它将 return 该类型的默认值。如果 collection 中有多个项目,它将抛出异常。

由于您是按 ID 搜索的,因此您可能永远不会期望匹配两个或更多元素。这样就排除了 FirstFirstOrDefault。如果没有找到具有匹配 ID 的项目,您应该根据您希望的行为使用 SingleSingleOrDefault

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

请注意,我删除了 persons 变量,因为您从未对它进行任何操作。而且您对 .Select 扩展方法的使用是多余的,因为您刚刚选择了相同的 object 已经被迭代了。 Select 适用于您想要转换 object.

问题只出在你的问题上。如果你想用 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();
        }
}

您现在可以通过tolist()将其转换为列表,并根据您的需要使用它。