2009-10-12 27 views
0

重複many times over(也these嘗試使用LINQ基於表分層數據搜索

我有了下面列的表稱爲類型。

ID 等級 名稱 PARENTID(父行的ID)

和被叫ParentObject表,該表具有下述列。 ID 類型ID

有4個不同的級別(可能會擴大到更多)。

所以,如果我有

ID:1 等級:0 名稱:0級 PARENTID:空

ID:2 等級:1 名稱:1級 PARENTID:1

ID:3 Level:2 名稱:Level2 ParentID:2

ID:4 等級:3 名稱:Level3的 PARENTID:3

ID:5 等級:4 名稱:級別4 PARENTID:4

在ParentObject表我剛好存儲樹存儲最低級別的ID。所以如果我的ID是4,我知道樹實際上是Level0 - > Level1 - > Level2 - > Level3

基本上,我需要能夠搜索所有對象的某個Type或Type Level 2例如在linq語句中。

假定存儲在ParentObject表中的TypeID是4,那麼Level3。

但其實我是想尋找在2級型有3

的ID會是什麼做到這一點,因爲存儲在ID可能是一個1級或級別2等的最佳方式,所有ParentObjects 。?

如果可能,最好在一個linq語句中。

+0

我可以告訴你如何在存儲過程中與公用表表達式...不知道有關linq tho:'( – JustLoren 2009-10-12 15:42:45

回答

0

在SQL(MS SQL Server 2005+)中,您可以使用Common Table Expression來實現遞歸。 LINQ不支持CTE。一些解決方法是創建存儲過程並將其映射爲Data Context的方法。

另一種解決方案是直接在您的C#代碼中編寫SQL並讓LINQ執行它。見this

或者你可以寫一點C#代碼,從你的數據中選擇,直到沒有更多的父ID。一個粗略的例子是...

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     IList<Data> data = new List<Data>(); 

     data.Add(new Data() { ID = 1, ParentID = 0, SomeData = "Example" }); 
     data.Add(new Data() { ID = 2, ParentID = 1, SomeData = "Another Example" }); 
     data.Add(new Data() { ID = 3, ParentID = 2, SomeData = "Example three" }); 
     data.Add(new Data() { ID = 4, ParentID = 3, SomeData = "Last example" }); 

     IList<Data> results = new List<Data>(); 

     Int32 parentID = 2; 

     while (parentID > -1) 
     { 
      results.Add(
       data.Where(x => x.ParentID == parentID).Single() 
      ); 

      parentID--; 
     } 
    } 
} 

public class Data 
{ 
    public Int32 ID { get; set; } 
    public Int32 ParentID { get; set; } 
    public String SomeData { get; set; } 
} 

希望這有助於!