尝试使用linq基于具有分层数据的表进行搜索

时间:2009-10-12 15:38:30

标签: c# asp.net linq-to-entities hierarchical-data

重复 many times over(以及these

我有一个名为Types的表,其中包含以下列。

ID 水平 名称 ParentID(父行的ID)

和一个名为ParentObject的表,其中包含以下列。 ID TYPEID

有4个不同的级别(可能会扩展到更多)。

所以,如果我有

ID:1 等级:0 名称:Level0 ParentID:null

ID:2 1级 名称:Level1 ParentID:1

ID:3 等级:2 名称:Level2 ParentID:2

ID:4 等级:3 名称:Level3 ParentID:3

ID:5 等级:4 姓名:Level4 ParentID:4

在ParentObject表中,我只存储最低级别的ID来存储树。因此,如果我拥有的ID是4,我知道该树实际上是Level0 - > Level1 - > Level2 - >级别3

基本上,我需要能够搜索特定类型的所有对象,或者在linq语句中搜索类型2。

假设存储在ParentObject表中的TypeID是4,那么Level3。

但实际上我想搜索Level 2类型ID为3的所有ParentObjects。

这样做的最佳方式是什么,因为存储的id可能是level1或level2等?

如果可能,最好在一个linq声明中。

1 个答案:

答案 0 :(得分:0)

在SQL(MS SQL Server 2005+)中,您可以使用Common Table Expression来实现递归。 LINQ不支持CTE。一些解决方法是创建存储过程并将其作为方法映射到数据上下文。

另一种解决方案是直接在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; }
}

希望这有帮助!