У меня есть SampleDB, которая содержит 3 таблицы.
Table Employees (EmployeeID, EmployeeName)
Table Projects (ProjectID, ProjectName)
Table ProjectResources (ProjectID, EmployeeID)
Таблица ProjectResources является таблицей перекрестных ссылок, которая создает отношение «многие ко многим» между сотрудниками и проектами.
Я хотел бы использовать LINQ для выбора всех сотрудников, которые еще не были назначены для конкретного проекта. Вот шаги, которые я предпринял:
Создана модель данных объекта из SampleDB выше с использованием мастера Entity Framework. Мастер создает две сущности: «Сотрудники» и «Проекты», которые я переименовал в «Сотрудник» и «Проект». Сущность Project имеет свойство навигации Employees, которое ссылается на коллекцию Employees, а сущность Employee имеет свойство навигации Projects, которое ссылается на коллекцию Projects. Таким образом, похоже, что EF правильно определила мои отношения «многие ко многим» между таблицей «Сотрудники» и «Проекты».
Теперь вот код, который я использовал, чтобы попытаться выбрать всех сотрудников, которые еще не были назначены для проекта.
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);
var проект прекрасно загружается с проектом, у которого ProjectID равен 1
var currentEmployees прекрасно загружается со списком сотрудников, назначенных в данный момент этому проекту
Затем я получаю следующее исключение, когда пытаюсь просмотреть представление результатов employeesNotAssignedToProject в окне просмотра:
{"Невозможно создать постоянное значение типа 'System.Collections.Generic.IEnumerable`1'.
В этом контексте поддерживаются только примитивные типы (такие как Int32, String и Guid). "}
Итак, вопросы:
- Почему я получаю это исключение?
- Есть ли другой способ (который работает) пытаться выполнить задачу такого типа? Обратите внимание, что я пытаюсь использовать метод «Кроме». Возможно, есть лучший способ.