Моя структура таблицы выглядит следующим образом:
Person 1-M PesonAddress
Person 1-M PesonPhone
Person 1-M PesonEmail
Person 1-M Contract
Contract M-M Program
Contract M-1 Organization
В конце этого запроса мне нужен заполненный граф объектов, где у каждого человека есть свои:
- PesonAddress в
- PesonPhone в
- PesonEmail в
- PesonPhone в
- Контракт - и это имеет свои
Теперь у меня был следующий запрос, и я подумал, что он отлично работает, но у него есть пара проблем:
from people in ctx.People.Include("PersonAddress")
.Include("PersonLandline")
.Include("PersonMobile")
.Include("PersonEmail")
.Include("Contract")
.Include("Contract.Program")
where people.Contract.Any(
contract => (param.OrganizationId == contract.OrganizationId)
&& contract.Program.Any(
contractProgram => (param.ProgramId == contractProgram.ProgramId)))
select people;
Проблема в том, что он фильтрует человека по критериям, но не по Контрактам или Программам Контракта. Он возвращает все Контракты, что у каждого человека есть не только те, которые имеют OrganId x, и то же самое относится к каждой из этих Программ Контракта соответственно.
Мне нужны только те люди, у которых есть хотя бы один контракт с OrgId, равным x, и где этот контракт имеет Программу с идентификатором y ... и для возвращаемого графа объектов, который имеет только контракты. эти совпадения и соответствующие программы в этом договоре.
Я вроде понимаю, почему он не работает, но я не знаю, как его изменить, чтобы он работал ...
Пока это моя попытка:
from people in ctx.People.Include("PersonAddress")
.Include("PersonLandline")
.Include("PersonMobile")
.Include("PersonEmail")
.Include("Contract")
.Include("Contract.Program")
let currentContracts = from contract in people.Contract
where (param.OrganizationId == contract.OrganizationId)
select contract
let currentContractPrograms = from contractProgram in currentContracts
let temp = from x in contractProgram.Program
where (param.ProgramId == contractProgram.ProgramId)
select x
where temp.Any()
select temp
where currentContracts.Any() && currentContractPrograms.Any()
select new Person { PersonId = people.PersonId, FirstName = people.FirstName, ..., ....,
MiddleName = people.MiddleName, Surname = people.Surname, ..., ....,
Gender = people.Gender, DateOfBirth = people.DateOfBirth, ..., ....,
Contract = currentContracts, ... }; //This doesn't work
Но у этого есть несколько проблем (где тип Person является объектом EF):
- Мне оставлено самостоятельно составлять карту, которой в этом случае достаточно много для отображения
- Когда я пытаюсь сопоставить список со свойством (например, Scholarship = currentScholarships), он говорит, что не может, потому что
IEnumerable
пытается привести к EntityCollection
- Включить не работает
Следовательно, как мне заставить это работать. Помня о том, что я пытаюсь сделать это как скомпилированный запрос, я думаю, что это означает, что анонимные типы отсутствуют.