0

重复 多次(还有这些

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

ID 级别名称 ParentID(父行的 ID)

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

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

所以如果我有

ID:1 级别:0 名称:Level0 ParentID:空

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 -> Level3

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

假设ParentObject表中存储的TypeID是4,所以Level3。

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

由于存储的 id 可能是 level1 或 level2 等,最好的方法是什么?

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

4

1 回答 1

0

在 SQL (MS 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; }
}

希望这可以帮助!

于 2009-10-12T20:06:08.937 回答