一、问题描述##
linq语句实现对数据的读取功能,其中select对获得数据进行类型转换,也成为投影。如下:
将emp中的信息通过ToAwards函数转换为年终奖对象
using(var context = new ScottDbContext())
{
IQueryable <YearAwards> users = from emp in context.EMP
select ToAwards(emp);
foreach(var u in users)
{
Console.WriteLine("员工编号:{0},员工姓名:{1},年终工资:{2}",u.empno,u.empname,u.yearaward); }
Console.ReadKey();
}
ToAwards函数:
static YearAwards ToAwards(EMP emp)
{
return new YearAwards
{
empno = emp.EMPNO,
empname = emp.ENAME,
yearaward = emp.SAL * 6,
};
}
运行结果:
未经处理的异常: System.NotSupportedException: LINQ to Entities does not recognize the method 'EF.YearAwards ToAwards(EF.EMP)' method, and this method cannot be translated into a store expression.
提示不能识别ToAwards函数,并且不能将其转化为存储过程。
二、思考与解决
一种解释是,select是对集合进行投影转换,所以需要在转换前做ToList()。
修改后:
using(var context = new ScottDbContext())
{
IEnumerable<YearAwards> users = from emp in context.EMP.ToList()
select ToAwards(emp);
foreach(var u in users)
{
Console.WriteLine("员工编号:{0},员工姓名:{1},年终工资:{2}",u.empno,u.empname,u.yearaward);
}
Console.ReadKey();
}