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

时间:2017-11-12 14:46:34

标签: c# linq asp.net-web-api2

我正在处理一个项目,我对转换类型有疑问。我想为我的项目创建简单搜索,但它不能返回带有此消息的结果:

  

错误1无法将类型'System.Collections.Generic.List'隐式转换为'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();
    }
}

3 个答案:

答案 0 :(得分:1)

您的方法的返回类型为TimeWorkMonthlies但在方法体内返回List<TimeWorkMonthlies>

你应该

  1. 将您的方法返回类型更改为IEnumerable<TimeWorkMonthlies> (您可以使用List<TimeWorkMonthlies>但是使用接口来抽象集合类型更好,原因很多)
  2. 如果您的目标只是返回一个元素,请使用FirstOrDefaultFirstSingleOrDefaultSingle extension methods of IEnumerable不关心除第一个元素之外的任何事情
  3. 哪种方法更好取决于您的数据和搜索条件 - 即您是否希望此ID是唯一的。

    从您的语义来看,您似乎正在进行类似ID查找的repository,所以我的猜测是解决方案2)并使用SingleSingleOrDefault

    最后一个选择是,如果ID

    找不到任何内容,您希望程序的行为方式如何
    1. 如果您想要例外,请使用Single
    2. 如果您想null使用SingleOrDefault
    3. 总结一下,您所要做的就是将最后一行代码更改为

      return result.Single();

      (当然,在此之前你不需要打电话给ToList()

答案 1 :(得分:0)

您的方法签名表示您只想返回单个对象。但是你要返回一个对象列表。当您只想返回一个对象时,使用.ToList()是不合适的。有四种适当的扩展方法:

First - 将返回集合中的第一个项目,如果集合为空,则抛出异常。

FirstOrDefault - 将返回集合中的第一个项目,如果集合为空,则返回该类型的默认项目。

Single - 如果集合中有一个项目,它将返回它。如果集合中没有项目,则抛出异常。如果集合中有多个项目,则抛出异常。

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

由于您正在按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扩展方法的使用是超级的,因为您刚刚选择了已经迭代的相同对象。 Select适用于您想要转换对象的时间。

答案 2 :(得分:0)

问题只在于你的问题。如果你想用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()将其转换为列表,并根据您的需要使用它。