2011-12-15 28 views
0

第二個問題我不得不問Linq!所以我承認我已經開始使用它了,我對它有點學習。但是,對於我最後的問題,我得到了一個很好的答案,所以我想我會再次碰運氣!基本上我現在一直在與這個戰鬥!使用Linq to Entity Framework運行查詢以返回大層次結構

我有一個很長的層次結構,我希望返回所有它,但在層次結構的末尾,我需要它是有條件的。

我有這樣的層次:

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

這是從人通過運營商表BusinessUnit,因爲我需要肯定的是,運營商排是那個人,就直奔BusinessUnit,因爲我需要確保操作員也被分配給一個BusinessUnit,但也有從人短路線BusinessUnit直接(僅供參考)

Person (object) -> BusinessUnits (collection) 

我是PersonID第一個表,也BusinessUnitID最後表。我基本上需要返回一個Person對象,它包含層次結構的每個部分以及某個BusinessUnit中的所有Operator記錄。

我有這塊Linq到目前爲止,它一直返回到運算符,但返回查詢中的所有運算符,而不僅僅是與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))); 

我有延遲加載關閉,如果可能,我需要在一個查詢中完成此操作。

我該如何限制返回的操作符,以便唯一返回的是那些在BusinessUnit中的?

UPDATE:

我已經回到我原來的查詢和辦理完畢,按照Nathan的回答。它已成爲一個複雜的查詢。

(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(); 

現在的問題是,幕後的實體框架似乎將每個對象自動附加到Person對象,除了BusinessUnit。

所以此查詢後,我需要這樣做:

// 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; 
} 

有什麼不對我的查詢,我需要做到這一點?

回答