C# 将匿名类型的列表转换为特定类类型的列表

C# 将匿名类型的列表转换为特定类类型的列表,c#,entity-framework,linq,C#,Entity Framework,Linq,我有一个抽象类“Employee” 我有一个扩展到此Employee类的factory方法来查询数据库,以返回所有活动员工的列表:- public static class EmployeeExtentions { public static List<Employee> FireEmployees(this List<Employee> AllCitiesEmps) { List<Employee&

我有一个抽象类“Employee”

我有一个扩展到此Employee类的factory方法来查询数据库,以返回所有活动员工的列表:-

 public static class EmployeeExtentions
    {
        public static List<Employee> FireEmployees(this List<Employee> AllCitiesEmps)
        {
            List<Employee> employees = new List<Employee>();

            using (var ctx = new hr_employeeEntities())
            {
                var emp = (from x in ctx.F_Emp
                           join y in ctx.HR_EMPLon (x.employee_id).ToString() equals y.EMPLID
                           where x.employment_status == "A"
                           select new { x, y }).ToList();

                // emp.ForEach( x => { employees.Add(new Employee(employees)); });
                //var emps = emp.Select(x => PropertyCopy<Employee>.CopyFrom(x)).ToList();    
                //emp.ForEach(x => { employees.Add(new Employee(x)); });

            }
            return employees;
        }
    }
公共静态类EmployeeExtensions
{
公共静态列表FireEmployees(此列表为AllCitieSamps)
{
列出员工=新列表();
使用(var ctx=new hr_employeeEntities())
{
var emp=(从ctx.F_emp中的x开始)
在ctx.HR\u EMPLon(x.employee\u id)中加入y
其中x.employment_status==“A”
选择新的{x,y}).ToList();
//emp.ForEach(x=>{employees.Add(新员工(employees));});
//var emps=emp.Select(x=>PropertyCopy.CopyFrom(x)).ToList();
//emp.ForEach(x=>{employees.Add(新员工(x));});
}
返回员工;
}
}

风险值“emp”是所有在职员工的列表,但不是匿名列表。我想将其转换为Employee类型的强类型列表。我的代码中有3条注释语句是我的尝试。

F_Emp和HR_EmpLon之间的关系是什么?根据表的不同,它们似乎通过Employee_Id/EMPID松散耦合,但是哪个表表示“Employee”

首先:这看起来不需要是一个扩展方法。扩展方法用于创建将应用于给定变量实例的方法。在本例中,“AllCitiesEmps”不使用此实例,因此至少这可能只是员工本身的静态方法。(坦率地说,作为存储库方法更好)

如果员工映射到F_Emp,则不需要加入:

public static List<Employee> FireEmployees()
{
    using (var context = new hr_employeeEntities())
    {
        var employees = context.F_Emp
            .Where(x => x.employment_status == "A")
            .ToList();
        return employees;
    }
}
公共静态列表FireEmployees()
{
使用(var context=new hr\u employeeEntities())
{
var employees=context.F_Emp
.其中(x=>x.就业状况==“A”)
.ToList();
返回员工;
}
}
如果Employee映射到HR_EmpLon表,而这些表之间不共享公共FK:(免责声明,这是内存插入,因此可能需要一些调整。我很少需要使用显式连接。)

公共静态列表FireEmployees()
{
使用(var context=new hr\u employeeEntities())
{
var employees=context.HR\u employeen
.Join(context.F_Emp,
h=>h.EMPLID,
e=>e.employee_id.ToString(),
(h,e)=>new{HREmployee=h,FEmployee=e})
。其中(x=>x.FEmployee.employment_status==“A”)
.选择(x=>x.hr员工)
.ToList();
返回员工;
}
}

如果员工不是映射到这两个表的实体,而是来自这两个表的数据的混合体,那么我建议在数据库中设置一个视图来连接这些数据,并将您的实体映射到该视图。

F_Emp和HR_EmpLon之间的关系是什么?根据表的不同,它们似乎通过Employee_Id/EMPID松散耦合,但是哪个表表示“Employee”

首先:这看起来不需要是一个扩展方法。扩展方法用于创建将应用于给定变量实例的方法。在本例中,“AllCitiesEmps”不使用此实例,因此至少这可能只是员工本身的静态方法。(坦率地说,作为存储库方法更好)

如果员工映射到F_Emp,则不需要加入:

public static List<Employee> FireEmployees()
{
    using (var context = new hr_employeeEntities())
    {
        var employees = context.F_Emp
            .Where(x => x.employment_status == "A")
            .ToList();
        return employees;
    }
}
公共静态列表FireEmployees()
{
使用(var context=new hr\u employeeEntities())
{
var employees=context.F_Emp
.其中(x=>x.就业状况==“A”)
.ToList();
返回员工;
}
}
如果Employee映射到HR_EmpLon表,而这些表之间不共享公共FK:(免责声明,这是内存插入,因此可能需要一些调整。我很少需要使用显式连接。)

公共静态列表FireEmployees()
{
使用(var context=new hr\u employeeEntities())
{
var employees=context.HR\u employeen
.Join(context.F_Emp,
h=>h.EMPLID,
e=>e.employee_id.ToString(),
(h,e)=>new{HREmployee=h,FEmployee=e})
。其中(x=>x.FEmployee.employment_status==“A”)
.选择(x=>x.hr员工)
.ToList();
返回员工;
}
}

如果员工不是映射到这两个表的实体,而是来自这两个表的数据的混合体,那么我建议在数据库中设置一个视图来连接此数据,并将您的实体映射到该视图。

您可以尝试以下操作:

public static class EmployeeExtentions
{
    public static List<Employee> FireEmployees(this List<Employee> AllCitiesEmps)
    {
        List<Employee> employees = new List<Employee>();

        using (var ctx = new hr_employeeEntities())
        {
            var emp = (from x in ctx.F_Emp
                       join y in ctx.HR_EMPL on (x.employee_id).ToString() equals y.EMPLID
                       where x.employment_status == "A"
                       select new
                       {
                           x.employee_id,
                           x.employment_status,
                           //x.OtherProperties
                           y.EMPLID,
                           //y.OtherProperties
                       }).ToList();

            employees = emp.Select(x => (new EmployeeDerived { EmployeeId = x.employee_id, EmploymentStatus = x.employment_status }) as Employee).ToList();

        }
        return employees;
    }

    private class EmployeeDerived : Employee
    {

    }    
}
公共静态类EmployeeExtensions
{
公共静态列表FireEmployees(此列表为AllCitieSamps)
{
列出员工=新列表();
使用(var ctx=new hr_employeeEntities())
{
var emp=(从ctx.F_emp中的x开始)
在(x.employee\u id)上的ctx.HR\u employ中加入y。ToString()等于y.employid
其中x.employment_status==“A”
选择新的
{
x、 雇员身份证,
x、 就业状况,
//x、 其他属性
y、 雇员,
//y、 其他属性
}).ToList();
employees=emp.Select(x=>(newEmployeederived{EmployeeId=x.EmployeeId,EmploymentStatus=x.employment\u status})作为雇员);
}
返回员工;
}
私有类EmployeeDerived:Employee
{
}    
}
请注意,您需要创建一个新的派生类型,因为您不能直接强制转换