2009-08-11 3 views
1

У меня есть SampleDB, который содержит 3 таблицы.Как использовать Entity Framework для работы со многими отношениями?

Table Employees (EmployeeID, EmployeeName) 
Table Projects (ProjectID, ProjectName) 
Table ProjectResources (ProjectID, EmployeeID) 

Таблица ProjectResources представляет собой таблицу перекрестных ссылок, которая создает отношения «многие-ко-многим» между работниками и проектами.

Я хотел бы использовать LINQ для выбора всех сотрудников, которые еще не были привязаны к конкретному проекту. Вот шаги, которые я предпринял:

  1. Создал модель данных сущности из SampleDB выше, используя мастер Entity Framework. Мастер создает два объекта: «Сотрудники» и «Проекты», которые я переименовал в «Сотрудник» и «Проект». Объект Project имеет свойство навигации Employees, которое ссылается на коллекцию сотрудников и сотрудника Employee, имеет свойство навигации по проектам, которое ссылается на коллекцию проектов. Таким образом, похоже, что EF правильно определил мои отношения «многие ко многим» между таблицей «Сотрудники» и «Проекты».

  2. Теперь вот код, который я использовал, чтобы выбрать всех сотрудников, которые еще не были назначены Проекту.

    SampleDBEntities db = new SampleDBEntities(); 
        var project = db.Projects.Include("Employees") 
              .FirstOrDefault(p => p.ProjectID == 1); 
        var currentEmployees = project.Employees; 
        var employeesNotAssignedToProject = 
          db.Employees.Except(currentEmployees); 
    

нагрузки вара проект штрафа с проектом, который имеет ProjectID из 1 вара currentEmployees нагрузок тонкодисперсных со списком сотрудников в настоящее время, присвоенный этого проект

Тогда я получаю следующее исключение при попытке смотреть resultsview ofemployeesNotAssignedToProject в окне просмотра:

{ "Невозможно создать постоянное значение типа„System.Collections.Generic.IEnumerable`1“. Только примитивные типы ('такие как Int32, String и Guid') поддерживаются в этом контексте "}

Итак вопросы:.?

  1. Почему я получаю это исключение
  2. ? есть еще один способ (который работает), чтобы пытаться выполнить этот тип задачи Обратите внимание, что я пытаюсь использовать «кроме» метод Может быть, есть лучший способ
+0

Прошу прощения за форматирование моего вопроса. Я новичок в SO. Попробуем и будем более подробно форматировать дальнейшие вопросы. – jsteele

+0

Надеюсь, что это лучше. :) –

+0

Ницца! Спасибо, что помог Крейгу. – jsteele

ответ

2

что об этом:..

var employeesNotAssignedToProject = db.Employees.Select(e => e).Where(e => (e.Projects.Count(c => c.ProjectID == 1)) == 0) 

Я не тестировал это, но в основном, он выбирает только тех сотрудников, где их коллекция проектов не включает проект, проверяя количество проектов с данным идентификатором.

+0

Это действительно работает. Благодарю. – jsteele

+2

! Любой() более эффективен, чем Count() == 0. –

+0

как это будет выглядеть в приведенном выше примере? –

Смежные вопросы