私のテーブル構造は次のとおりです。
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;
問題は、それが個人を基準にフィルターするが、契約または契約のプログラムにはフィルターをかけないことです。これにより、OrganizationIdがxの契約だけでなく、各契約の各プログラムにも同じことが当てはまるすべての契約が復活します。
私が欲しいのは、OrgIdがxで少なくとも1つのコントラクトを持ち、そのコントラクトがyのIdでプログラムを持っている人だけです...そして返されるオブジェクトグラフには、一致するコントラクトだけがあります。一致するその契約内のプログラム。
なぜ機能しないのかはわかりますが、変更方法がわからないので機能しています...
これはこれまでの私の試みです:
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
- インクルードが機能しない
したがって、これを機能させるにはどうすればよいですか。私はこれをコンパイルされたクエリとして実行しようとしていることを念頭に置いて、匿名型が出ていることを意味すると思います。