我是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无法隐式转换类型 &#39;&System.Linq.IQueryable LT; AnonymousType#2 - ;&#39;至 &#39;&System.Linq.IQueryable LT; ESSCS.Models.ESSRequest&GT;&#39 ;.一个明确的 转换存在(你错过了吗? cast?)E:\ MVC \ ESSCS \ ESSCS \ Controllers \ RequestController.cs 138 53 ESSCS
答案 0 :(得分:2)
你方程两侧的类/对象的类型不相同。
在左手边,你有: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;
然后,如果您需要Anonymous类型,您可以执行此操作,在上面的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;
}
答案 1 :(得分:0)
您正在创建匿名类型的查询,而不是变量中指定的实际类型。所以不是创建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
};