2016-06-24 4 views
0

EFでは、取得するデータに対してカスタムクエリを持つ仮想コレクションを使用できますか?例えばカスタム取得メソッドを使用したEF仮想コレクション

、私はクラスperson.csを持っていると私はそのクラス内のプロパティを持っている場合:public ICollection<job> jobsが、私はプロパティは、例えば、私が書くカスタムクエリによって定義することを望む、_context.jobs.where(j => j.backup_person_id == id).select(j);ではなく、探しに不履行jobsのテーブルのちょうどperson_id

これは可能ですか?もしそうなら、どのように達成されますか?

[編集]より具体的には

:さんはjobsテーブルが2列managermain_leadを持っているとしましょう。私はその後、特性を有するために私person.csクラスをしたい:ICollection<job> managerJobsmanagerフィールドはmain_leadフィールドはそのperson_codeフィールドに一致する<job>エントリのすべてが含まれpersonICollection<job> main_leadJobsperson_codeフィールドに一致する<job>エントリのすべてが含まれていますperson 、私の頭の中で

、それはかなり簡単なようだ:= select * from tbl_jobs where manager = person_codeICollection<job> managerJobsICollection<job> main_leadJobs = select * from tbl_jobs where main_lead = person_code

私はそれは私が

の上に持っていたものよりも理にかなって願っています
+0

私はあなたが間違っていると思います。あなたは何を達成しようとしているかについてより多くの情報を共有できますか?今は論理的ではないようだから。 – Szer

+1

「人」がハードコーディングされた別の「人」の「ジョブ」の「コレクション」になるように、 'ジョブ'の 'コレクション'を再定義したいと思っています。これはどのように動作するはずではありません。 – Szer

+0

私は答えの上に – blubberbo

答えて

0

いいえ、できません。しかし、もっと一般的に達成したいことは、まったく別のやり方で可能です。あなたがperson.jobsコレクションにアクセスしたときには、次に

var person = _context.People.Find(personId); 
_context.Entry(person) 
    .Collection(b => b.jobs) 
    .Query() 
    .Where(j => j.backup_person_id == backupId) 
    .Load(); 

ます:あなたが行うことができますが、特定のpersonを扱うのではなく、一般的にjobsを含む状況でhttps://msdn.microsoft.com/en-us/data/jj574232.aspx#explicitFilter

、:MSDNの記事を参照してください。フィルタリングされたアイテムのみです。これは、クエリーが2つあることを意味します。一方、すべてのジョブをInclude経由で大量に読み込むと、1つのクエリーで実行されます。

複数の人が作業している場合は、この明示的な負荷を複数回実行する必要があります。つまり、各人物(N + 1)のクエリです。そのような状況では、あなたが個別に各エンティティに照会する方がいいでしょう:言い換えれば

var people = db.People.Where(...).ToList(); 
var jobs = db.Jobs.Where(m => people.Select(m => m.Id).Contains(m.person_id) && m.backup_person_id == backupId).ToList(); 

、あなたが選択した特定の人に属しているだけの仕事を照会し、さらにそのあなたの基準によって、それはこの場合、制限していますバックアップ担当者のIDです。次に、人々を繰り返しているときに、コンテキスト内の現在の人物に属するジョブだけにメモリ内のフィルタjobsをフィルタリングすることができます。

+0

の上に明らかにしようとしました!私は2つのフォローアップの質問があります。したがって、そのタイプのクエリをクラス定義に入れる方法はありませんか?私はそれを使用するたびに手動で書き出す必要がありますか?また、あなたが書いた構文を正確に「メモリ内に」書いているのは何ですか? – blubberbo

関連する問題