Моя таблица имеет следующую структуру:
Person 1-M PesonAddress
Person 1-M PesonPhone
Person 1-M PesonEmail
Person 1-M Contract
Contract M-M Program
Contract M-1 Organization
В конце этого запроса мне нужен заполненный граф объектов, в котором у каждого человека есть свои:
- ПесонАдреса
- PesonPhone's
- PesonEmail's
- PesonPhone's
- Contract's - and this has its respective
- Program's
Теперь у меня был следующий запрос, и я подумал, что он отлично работает, но у него есть пара проблем:
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;
Проблема в том, что он фильтрует человека по критериям, но не по контрактам или программам контракта. Он возвращает все Контракты, которые есть у каждого человека, а не только те, которые имеют OrganizationId 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
- Включить не работает
Следовательно, как мне заставить это работать. Имея в виду, что я пытаюсь сделать это как скомпилированный запрос, я думаю, что это означает, что анонимные типы отсутствуют.