无法从多个表mvc 4执行Linq查询

时间:2015-02-23 14:54:08

标签: c# asp.net-mvc

我是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

2 个答案:

答案 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
                                        };