2009-08-20 76 views
1

我無法弄清楚這一點。我有一個名爲Employee with和Id字段的表。該表還包含一個ManagerId字段,該字段具有指向員工ID字段的外鍵。當我將表作爲一個實體添加到實體數據模型中時,它會創建一個帶有EmployeeChildren集合元素和EmployeeParent元素的新Employee實體。我可以檢索所有員工,並將他們放入員工實體的新實例中。僱員實體將有許多孩子,每個孩子實體可以有許多自己的孩子,並且每個孩子都有一個指向其父母的指針。Linq to Entities - 從存儲過程中檢索具有「自我引用」的實體

我現在需要做的是使用存儲過程檢索這些員工的子集。現在,如果我搜索僱員John Doe,他有2個人,那麼存儲過程將返回3行。

僱員經理ID名稱

1空比爾

2 1簡

3 2李四

這裏是我的代碼做檢索:

using (var entity = new TimeEntryEntities()) 
    { 

     var employees = 
       from E in entity.EmployeeSearch(search) 
       orderby E.Name 
       select E; 


     return employees.ToList<Employee>(); 
    } 

權現在,這個代碼返回3個獨立的實體。我怎麼能把它們組合成一個?

+0

當您不使用存儲過程時,是否按預期工作?如果您直接使用LINQ查詢檢索單個員工,是否應該填寫「經理」和「報告」集合? – 2009-08-20 16:15:06

+0

它確實有效,但它不會以我需要的方式回來。它將檢索該員工,該實體將擁有一個父實體。父實體將有父母和孩子......等等。我需要它從頂級父母開始,而不是在較低級別的孩子。我希望這是有道理的。 – 2009-08-20 16:35:02

回答

0

聽起來就像你試圖將層次展平,所以只返回一條記錄。也許在存儲過程中通用表表達式(CTE)可以幫助: Here is an alternate of a similar request

而且another example with more detail(但你要免費註冊):

+0

我在過程中使用CTE來返回3行。它發現子行然後使用CTE返回父​​...然後父母的父...等。這導致從數據庫返回3行。現在我需要將這些行放入我的Employee實體中。我想知道是否需要手動執行此操作,並在此情況下將linq忘記爲實體。 – 2009-08-20 16:50:46

-1

你應該只返回你所感興趣的實體EF將自動爲您檢索相關實體。 如果我們沒有使用自引用,這將更容易可視化,這個概念已經成爲現實。