Преобразование списка анонимного типа в список определенного типа класса - PullRequest
0 голосов
/ 16 апреля 2019

У меня есть абстрактный класс «Сотрудник».

У меня есть фабричный метод, который распространяется на этот класс 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 комментария, которые были моими попытками.

Ответы [ 2 ]

2 голосов
/ 16 апреля 2019

Какая связь между F_Emp и HR_EmpLon? Кажется, что они слабо связаны через Employee_Id / EMPID в зависимости от таблицы, но какая таблица представляет «Сотрудник»?

Во-первых: это не похоже на метод расширения. Методы расширения предназначены для создания метода, который будет применяться к данному экземпляру переменной. В этом случае «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;
    }
}

Если Сотрудник сопоставляется с таблицей HR_EmpLon, и эти таблицы не разделяют между собой общий FK: (Отказ от ответственности, это удар из памяти, поэтому может потребоваться некоторая настройка. Мне редко нужно использовать явные объединения.)

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

Если Сотрудник не является сущностью, сопоставленной с какой-либо таблицей, но представляет собой совокупность данных из этих двух таблиц, то я бы порекомендовал создать представление в вашей базе данных, чтобы объединить эти данные и сопоставить вашу сущность с представлением.

0 голосов
/ 16 апреля 2019

Вы можете попробовать что-то вроде этого:

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
    {

    }    
}

Обратите внимание, что вам нужно будет создать новый производный тип, поскольку вы не можете напрямую привести его к абстрактному типу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...