Как мне правильно получить эту ViewModel?

Используя MVC 5 и Entity Framework, я пытаюсь настроить ViewModel для представления индекса для демонстрации сотрудников и их целей. У меня есть таблица сотрудников, таблица employeeMap (таблица соединений с полезной нагрузкой) и таблица целей. Существует отношение «один ко многим» между Employee и EmployeeMap, а также между Goal и EmployeeMap. Я новичок и застреваю в индексном представлении, которое изначально должно отображать сотрудников, а когда выбран один сотрудник, должны отображаться цели сотрудников.

Я не могу правильно выполнить действие индекса:

var viewModel = new EmployeeGoals();

        viewModel.Employees = db.Employees
            .Include(d => d.Department)
            .Include(e => e.Position)
            .Include(m => m.EmployeeMaps)
            .Where(d => d.OrganizationID == oid && d.Department.ManagerID == currentUser.EmployeeID)
            .OrderBy(d => d.HireDate);


        if (id != null)
        {
            ViewBag.EmployeeID = id.Value;
            viewModel.EmployeeMaps = viewModel.Employees.Where(e => e.ID == id.Value).Single().EmployeeMaps;
            viewModel.Goals = viewModel.EmployeeMaps.Where(e => e.EmployeeID == ViewBag.EmployeeID).Select(e => e.Goals);



            }

            if (goalID != null)
            {
                ViewBag.GoalID = goalID.Value;
                viewModel.Activities = viewModel.Goals.Where(
                    x => x.ID == goalID).Single().Activities;
            }

            return View(viewModel);

Я правильно заполняю viewmodel.employees, но не viewmodel.goals

о, и модель просмотра:

public class EmployeeGoals
    {
        public IEnumerable<EmployeeMap> EmployeeMaps { get; set; }
        public IEnumerable<Employee> Employees { get; set; }
        public IEnumerable<Goal> Goals { get; set; }
    }

Намек, который поможет мне пройти это, был бы замечательным. Спасибо

Получил работу, используя другой подход:

viewModel.Employees = db.Employees
                .Include(d => d.Department)
                .Include(e => e.Position)
                .Include(m => m.EmployeeMaps)
                .Where(d => d.OrganizationID == oid && d.Department.ManagerID == currentUser.EmployeeID)
                .OrderBy(d => d.HireDate);


            if (id != null)
            {
                ViewBag.EmployeeID = id.Value;
                viewModel.EmployeeMaps = viewModel.Employees.Where(e => e.ID == id.Value).Single().EmployeeMaps;
                viewModel.Goals = from g in db.Goals
                                  join m in db.EmployeeMaps on g.ID equals m.GoalID
                                  join e in db.Employees on m.EmployeeID equals e.ID 
                                  where m.EmployeeID == id.Value
                                  select g;
            }

не мог понять, как получить результат, используя свойства навигации, поэтому остановился на приведенном выше решении. Это работает, но не слишком ли часто я обращаюсь к базе данных?? Кроме того, в итоге получилось сочетание синтаксиса LINQ - я знаю, следует использовать только один из них :-/


person tlyng    schedule 25.04.2014    source источник
comment
Ваш viewModel.Goals является подмножеством viewModel.EmployeeMaps. Но где устанавливается viewModel.EmployeeMaps?   -  person Raymen    schedule 25.04.2014
comment
Кажется, что в вашем коде нет явных проблем. Скорее всего, инструкция LINQ, включающая EmployeeMaps, просто ничего не возвращает. Я бы разбил это на несколько строк, а затем запустил отладчик, чтобы вы могли проверить значение, возвращаемое вызовом Where, и посмотреть, есть ли на самом деле какие-либо связанные цели.   -  person Chris Pratt    schedule 25.04.2014
comment
@Raymen - правильно, я пропустил это в примере, я отредактировал это, и теперь у меня осталось то, что я считаю своей настоящей проблемой. Как мне заполнить viewmodel.goals - код не работает :-/   -  person tlyng    schedule 25.04.2014


Ответы (1)


Вы должны использовать SelectMany:

viewModel.Goals = viewModel.EmployeeMaps
                           .Where(e => e.EmployeeID == ViewBag.EmployeeID)
                           .SelectMany(e => e.Goals);

потому что EmployeeMaps.Where() — это IEnumerable, поэтому Select производит IEnumerable<IEnumerable<Goal>>. SelectMany сглаживает это в IEnumerable<Goal>.

person Gert Arnold    schedule 25.04.2014