2009-10-12 30 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; } 
} 

希望这有助于!