2011-12-15 10 views
0

2番目の質問私はLinqについて質問しなければなりませんでした!だから、私はそれを使い始めたばかりだと認めるだろうし、私はそれを少しでも覚えている。しかし私は私の最後の質問に対して素晴らしい答えを得たので、私は再び私の運が偶然になると思った!私は基本的に今日これで戦っている!Linq to Entity Frameworkを使用してクエリを実行し、大きな階層を返す

私はそれをすべて返すことを望む長い階層を持っていますが、階層の最後には条件付きである必要があります。

私はこの階層を持っている:

Person (object) -> Party (object) -> Workers (collection) 
-> WorkerOperatorAssignment (collection) -> Operator (object) 
-> OperatorBusinessAssignment (collection) -> BusinessUnit (object) 

これは私がする必要があると私は演算子の行は、その人のためのものであることを確認する必要があるとして、オペレータのテーブルを介してBusinessUnit、直BusinessUnitにする人からですまた、BusinessUnitに割り当てられているオペレータを確保するが、直接(FYI)BusinessUnitから人へ短いルート

Person (object) -> BusinessUnits (collection) 

私は最初のテーブルのためPERSONIDを持っているにもあり、また、最後のテーブルのためにBusinessUnitID。基本的には、階層の各部分を含むPersonオブジェクトと、特定のBusinessUnitにあるすべてのOperatorレコードを返す必要があります。

私はこれまでLinqを持っていましたが、これはOperatorに返されますが、BusinessUnitとの特定の関連付けを持つものだけでなく、クエリ内のすべての演算子を返します。これは、Include文にwhere句を入れることができないためです。

var PersonQuery = 
    DbContext.People.Where(p => p.PersonPartyID == personPartyID) 
    .Include(p => p.Party.Workers.Select(w => w.WorkerOperatorAssignments.Select(a => a.Operator))); 

私は遅延ロードをオフにしました。可能であれば、これを1つのクエリで実行する必要があります。

返される演算子を制限して、返される演算子がBusinessUnitに含まれるものだけになるようにするにはどうすればよいですか?

UPDATE:

私は戻って私の元のクエリに行き、ネイサンの答えに従って、それを完了しました。これは複雑なクエリになっています。今

(from P in DbContext.People 
where P.PersonPartyID == personPartyID 
select new 
{ 
    PersonObject = P, 
    PartyObject = P.Party, 
    WorkerObject = P.Party.Workers.FirstOrDefault(), 
    BusinessUnit = P.BusinessUnits.Where(bu => bu.BusinessUnitID == businessUnitID).FirstOrDefault(), 
    WorkerOperatorAssignments = P.Party.Workers.SelectMany(w => w.WorkerOperatorAssignments) 
              .Where(a => a.Operator.OperatorBusinessUnitAssignments.Any(oa => oa.BusinessUnit.BusinessUnitID == businessUnitID)), 
    Operator = P.BusinessUnits.Where(bu => bu.BusinessUnitID == businessUnitID) 
          .SelectMany(bu => bu.OperatorBusinessUnitAssignments) 
          .Select(a => a.Operator) 
}).SingleOrDefault(); 

問題、舞台裏でEntity Frameworkのは、オートBusinessUnit EXCEPT Personオブジェクトへのすべてのオブジェクトを添付するように思われていること。

だから、このクエリの後、私はこれを実行する必要があります。

// get the person object 
if (PersonQuery != null) 
{ 
    // get the person object 
    Person ReturnObject = PersonQuery.PersonObject; 

    // now attach the business unit 
    ReturnObject.BusinessUnits.Add(PersonQuery.BusinessUnit); 
} 
else 
{ 
    return null; 
} 

私はこれを行う必要があることを、私のクエリの何が問題になっているのですか?

答えて

関連する問題