C# 将匿名类型的列表转换为特定类类型的列表
我有一个抽象类“Employee” 我有一个扩展到此Employee类的factory方法来查询数据库,以返回所有活动员工的列表:-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&
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
{
}
}
请注意,您需要创建一个新的派生类型,因为您不能直接强制转换