我正在处理一个项目,我对转换类型有疑问。我想为我的项目创建简单搜索,但它不能返回带有此消息的结果:
错误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();
}
}
答案 0 :(得分:1)
您的方法的返回类型为TimeWorkMonthlies
但在方法体内返回List<TimeWorkMonthlies>
你应该
IEnumerable<TimeWorkMonthlies>
(您可以使用List<TimeWorkMonthlies>
但是使用接口来抽象集合类型更好,原因很多)FirstOrDefault
,First
,SingleOrDefault
或Single
extension methods of IEnumerable不关心除第一个元素之外的任何事情哪种方法更好取决于您的数据和搜索条件 - 即您是否希望此ID
是唯一的。
从您的语义来看,您似乎正在进行类似ID查找的repository,所以我的猜测是解决方案2)并使用Single
或SingleOrDefault
最后一个选择是,如果ID
Single
null
使用SingleOrDefault
总结一下,您所要做的就是将最后一行代码更改为
return result.Single();
(当然,在此之前你不需要打电话给ToList()
)
答案 1 :(得分:0)
您的方法签名表示您只想返回单个对象。但是你要返回一个对象列表。当您只想返回一个对象时,使用.ToList()
是不合适的。有四种适当的扩展方法:
First - 将返回集合中的第一个项目,如果集合为空,则抛出异常。
FirstOrDefault - 将返回集合中的第一个项目,如果集合为空,则返回该类型的默认项目。
Single - 如果集合中有一个项目,它将返回它。如果集合中没有项目,则抛出异常。如果集合中有多个项目,则抛出异常。
SingleOrDefault - 如果集合中有一个项目,它将返回它。如果集合中没有项目,它将返回该类型的默认值。如果集合中有多个项目,则会抛出异常。
由于您正在按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
扩展方法的使用是超级的,因为您刚刚选择了已经迭代的相同对象。 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()
将其转换为列表,并根据您的需要使用它。