按深度级别

时间:2018-06-01 02:44:13

标签: c# asp.net entity-framework linq

我有" Google搜索"好几个小时但我仍然无法找到答案。基本上,我有一个看起来像这样的表:

Parent  |   ID
null    |   1
1       |   2
2       |   3
3       |   4
3       |   5
3       |   6
4       |   7
null    |   8

如何根据Id和"深度级别"使用实体linq进行过滤? (这是一个简单的元素计数,包括Id元素和通过Id元素的 n - 1 元素)?

例如,当我通过ID 2 和深度级别 2

结果将是

Parent  |   ID
2       |   3 //level 1
3       |   4 //level 2
3       |   5 //level 2
3       |   6 //level 2

如果我通过了ID 3 和深度级别 2

结果将是

Parent     ID
3       |   4 //level 1
3       |   5 //level 1
3       |   6 //level 1
4       |   7 //level 2

感谢您的帮助

2 个答案:

答案 0 :(得分:0)

我厌倦了在控制台应用程序中模拟您的场景。以下是可能的解决方案之一。它非常基本,所以你需要根据需要改变和使用它。但它会根据您在问题中提到的逻辑返回结果。

class Program
{
    static List<Data> data = new List<Data>();
    static List<Data> result = new List<Data>();

    static void Main(string[] args)
    {

        data.Add(new Data() { Parent = null, ID = 1 });
        data.Add(new Data() { Parent = 1, ID = 2 });
        data.Add(new Data() { Parent = 2, ID = 3 });
        data.Add(new Data() { Parent = 3, ID = 4 });
        data.Add(new Data() { Parent = 4, ID = 5 });
        data.Add(new Data() { Parent = null, ID = 6 });

        // Take() implementation is for Depth. 
        result = findChildren(3).Take(2).ToList();

        Console.ReadLine();
    }

    static List<Data> findChildren(int Id)
    {
        return data.Where(x => x.Parent == Id ).Union(data.Where(x => x.Parent == Id).SelectMany(y => findChildren(y.ID))).ToList();
    }

}

public class Data
{
    public int? Parent { get; set; }
    public int ID { get; set; }
}

答案 1 :(得分:0)

var Id = 2;
var Level = 2;

var head = new Item { Id = Id };
var result = new List<Item>();
for(var i = 0; i < Level; i++)
{
    head = context.Table.FirstOrDefault(x => x.ParetId == head.Id);
    if(head != null)
        result.Add(head);
    else
        break;
}