第二個問題我不得不問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;
}
有什麼不對我的查詢,我需要做到這一點?
我首先看到了這個,但查詢變得複雜,所以我希望有一個更簡單的方法,我正在更新我的問題與新的查詢中 – eyeballpaul 2011-12-15 16:53:52