C# 尝试使用linq基于分层数据表进行搜索

C# 尝试使用linq基于分层数据表进行搜索,c#,asp.net,linq-to-entities,hierarchical-data,C#,Asp.net,Linq To Entities,Hierarchical Data,复制并且 我有一个名为Types的表,它有以下列 身份证 数量 名称 ParentID父行的ID 和一个名为ParentObject的表,该表具有以下列。 身份证件 类型ID 有4个不同的级别可能会扩展到更多 所以如果我有 身份证号码:1 级别:0 名称:Level0 ParentID:null 身份证号码:2 级别:1 名称:Level1 父ID:1 身份证号码:3 级别:2 名称:二级 家长编号:2 身份证号码:4 级别:3 名称:三级 家长编号:3 身份证号码:5 级别:4 名称:Leve

复制并且

我有一个名为Types的表,它有以下列

身份证 数量 名称 ParentID父行的ID

和一个名为ParentObject的表,该表具有以下列。 身份证件 类型ID

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

所以如果我有

身份证号码:1 级别:0 名称:Level0 ParentID:null

身份证号码:2 级别:1 名称:Level1 父ID:1

身份证号码:3 级别:2 名称:二级 家长编号:2

身份证号码:4 级别:3 名称:三级 家长编号:3

身份证号码:5 级别:4 名称:Level4 家长编号:4

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

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

假设ParentObject表中存储的TypeID为4,则为Level3

但我实际上想搜索级别2类型ID为3的所有ParentObject

既然存储的id可以是level1或level2,那么最好的方法是什么


如果可能,最好在一个linq语句中。

在SQL Server 2005+中,您可以使用实现递归。LINQ不支持CTE。创建存储过程并将其作为方法映射到您的数据上下文需要一些变通方法

另一个解决方案是直接在C代码中编写SQL并让LINQ执行。看

或者您可以编写一些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; }
}

希望这有帮助

我可以向您展示如何使用公共表表达式在存储过程中。。。林克寿不太清楚:'