Моей структура таблицы выглядит следующим образом:Linq гуру - фильтрация связанные с ней структуры
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;
Проблема заключается в том, что он фильтрует человека по критериям, а не по контрактам или программам контракта. Он возвращает все Контракты, что каждый человек имеет не только те, которые имеют Организацию 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 объект):
- Я остался сделать отображение на себя, в данном случае существует довольно много, чтобы отобразить
- Когда я пытаюсь сопоставить список с собственностью (т. Стипендия = currentScholarships) он говорит, что я не могу, потому что
IEnumerable
пытается быть отлиты вEntityCollection
- Include не работает
Поэтому как я могу получить эту работу. Помня, что я пытаюсь сделать это как скомпилированный запрос, поэтому я думаю, что это означает, что анонимные типы недоступны.
Вы уверены, что контракт-программа M-M? Итак, для этого есть таблица перекрестных ссылок? – Fedor
Да ... В базе данных есть таблица между Контрактом и Программой, которая облегчает ММ, но структура Entity абстрагировала эту «сущность» ... –