我是linq的初学者,我正在尝试编写linq查询以从多个表中获取数据
IQueryable<ESSRequest> ESSRequest = from essrequest in db.ESSRequest
join emps in db.HrEmpS on essrequest.HrEmp_no equals emps.HrEmp_no
join emp in db.HrEmp on emps.Emp_no equals emp.Emp_no
where essrequest.Next_Approval == user_id
select new { essrequest, emp_name=emp.Emp_Name};
我得到以下错误
错误71无法隐式转换类型'System.Linq.IQUERABLE<匿名类型#2>'到'System.Linq.IQUERABLE<ESSCS.型号.ESSRequest>'。明确的转换存在(是否缺少铸造?)E: \MVC\ESSCS\ESSCS\Controllers\RequestController.cs 138 53 ESSCS
等式两边的类/对象的类型不相同。
左手边有:IQueryable<ESSRequest>
在右手边,您有一个匿名类型,您正在使用LINQ:select new { essrequest, emp_name=emp.Emp_Name};
生成
两者必须是相同的类型。
IQueryable<ESSRequest> ESSRequest = from essrequest in db.ESSRequest
join emps in db.HrEmpS on essrequest.HrEmp_no equals emps.HrEmp_no
join emp in db.HrEmp on emps.Emp_no equals emp.Emp_no
where essrequest.Next_Approval == user_id
select essrequest;
然后,如果你需要匿名类型,你可以这样做,在上面linq之后使用这个:
var aType = ESSRequest.Select(s => new { Employee = (s), emp_name = s.Emp_Name });
然后你可以这样访问它:
foreach( var employee in aType)
{
var empNamefromObject = employee.Employee.Emp_Name;
var empName = employee.Emp_Name;
}
您正在创建一个匿名类型的查询,而不是变量中指定的实际类型。所以不是创建IQueryable<ESSRequest>
,而是创建IQueryable<AnonymousTypeX>
。相反,当您执行select
时,在那里指定类型,或者在您的情况下,看起来您可以简单地选择essrequest
。如果还希望包含Emp_name
值,则必须使用匿名类型或创建另一个要使用的模型类。
IQueryable<ESSRequest> ESSRequest = from essrequest in db.ESSRequest
join emps in db.HrEmpS on essrequest.HrEmp_no equals emps.HrEmp_no
join emp in db.HrEmp on emps.Emp_no equals emp.Emp_no
where essrequest.Next_Approval == user_id
select essrequest;
或者,如果您需要Emp_Name
的值,请创建一个类似这样的类:
private class RequestAndName
{
public ESSRequest ESSRequest { get; set; }
public string Emp_Name { get; set; }
}
并像这样填充:
IQueryable<RequestAndName> ESSRequest = from essrequest in db.ESSRequest
join emps in db.HrEmpS on essrequest.HrEmp_no equals emps.HrEmp_no
join emp in db.HrEmp on emps.Emp_no equals emp.Emp_no
where essrequest.Next_Approval == user_id
select new RequestAndName
{
ESSRequest = essrequest,
Emp_Name = emp.Emp_Name
};