2010-01-06 70 views
7

我有一個存儲在數據庫中的組織結構圖樹結構。 是有點像使用LINQ從數據庫檢索樹結構

ID (int); 
Name (String); 
ParentID (int) 

在C#中它表示一類像

class Employee 
{ 
int ID, 
string Name, 
IList < Employee> Subs 
} 

我想知道是如何從數據庫中檢索這些值使用,填補了C#對象的最佳方式LINQ(我正在使用實體框架)

必須有一些比打電話來獲得頂級然後重複調用以獲得潛艇等更好的東西。

如何最好地做到這一點?

回答

1

我想爲實體添加一個字段以包含父ID,然後將整個表拖入內存中,使List subsub爲null。然後通過對象迭代遍歷對象並使用linq將對象填充到列表中。只有一個數據庫查詢應該是合理的。

+0

我發現這樣做是像 的foreach(在所有位置的位置) { 的foreach的方式(在所有的位置位置1) { 如果(position1.ParentPositionID == position.ID) { 如果(position.Subs == NULL){ position.Subs =新名單(); } position.Subs.Add(position1); } } } 有沒有更好的方法? – Emad 2010-01-08 20:02:10

0

那麼...即使使用LINQ,你也需要兩個查詢,因爲任何單個查詢都會複製主要員工,因此會導致創建多個員工(實際上是相同的)......但是,您可以稍微隱藏一點linq當你創建對象的時候,那就是當你執行第二個查詢時,像這樣的:

var v = from u in TblUsers 
     select new { 
      SupervisorName = u.DisplayName, 
      Subs = (from sub in TblUsers where sub.SupervisorID.Value==u.UserID select sub.DisplayName).ToList() 
     }; 
2

如果您使用SQL Server 2008,則可以使用new HIERARCHYID功能。

組織在過去 掙扎,樹像 結構在數據庫中的表現,很多 加入大量複雜的邏輯進入 的地方,無論是組織 層次或定義BOM(比爾 材料)其中一件成品 依賴於另一半成品 材料/套件物品和這些套件 物品依賴於另一半成品 成品或原材料。

SQL Server 2008有解決 我們整個 層次存儲的數據類型 HIERARCHYID問題。 HierarchyID是一個變量 長度系統數據類型。HIERARCHYID 用於定位在 層次像斯科特元素的位置是 首席執行官馬克以及拉維 報告斯科特和本和勞拉 馬克,維傑,詹姆斯報告和弗蘭克 拉維報告。

因此,使用可用的新功能,只需返回不需要使用LINQ的數據。缺點是,你需要使用UDF或存儲過程的任何東西超越了簡單的根查詢:

SELECT @Manager = CAST('/1/' AS hierarchyid)   
SELECT @FirstChild = @Manager.GetDescendant(NULL,NULL)