我有一个抽象类“ Employee”。
我在此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;
}
}
var'emp'是所有在职员工的列表,但是匿名列表。我想将其转换为Employee类型的强类型列表。我的代码中有3条带注释的语句,这是我的尝试。
答案 0 :(得分:2)
F_Emp和HR_EmpLon之间是什么关系?似乎这些表通过Employee_Id / EMPID松散耦合,但是哪个表代表“ Employee”?
首先:这看起来好像不需要作为扩展方法。扩展方法用于创建将应用于给定变量实例的方法。在这种情况下,“ AllCitiesEmps”没有使用此实例,因此至少这可能只是Employee自身的静态方法。 (坦率地说,最好将其用作存储库方法)
如果将Employee映射到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;
}
}
如果Employee映射到HR_EmpLon表,并且这些表之间没有共享公共FK :(免责声明,这是内存的刺伤,因此可能需要进行一些调整。我很少需要使用显式联接。)< / p>
public static List<Employee> FireEmployees()
{
using (var context = new hr_employeeEntities())
{
var employees = context.HR_EMPLon
.Join(context.F_Emp,
h => h.EMPLID,
e => e.employee_id.ToString(),
(h, e) => new {HREmployee = h, FEmployee = e})
.Where(x => x.FEmployee.employment_status == "A")
.Select(x => x.HREmployee)
.ToList();
return employees;
}
}
如果Employee不是映射到两个表的实体,而是表示来自这两个表的数据的混合,那么我建议您在数据库中设置一个View来联接此数据,然后将您的实体映射到该视图。
答案 1 :(得分:0)
您可以尝试以下操作:
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
{
}
}
请注意,您将需要创建一个新的派生类型,因为您不能直接转换为抽象类型。