【问题标题】:Get recurring child result by depth level按深度级别获取重复出现的子结果
【发布时间】:2018-06-01 02:44:12
【问题描述】:

我已经“谷歌”了很多小时,但我仍然无法找到答案。基本上,我有一个看起来像这样的表:

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

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

例如,当我通过 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

感谢您的帮助

【问题讨论】:

  • 你能解释更多吗?这个问题对我来说仍然不清楚(实际上整个情况并不清楚)。如果您解释更多,我可能会有所帮助
  • 请检查我的回答。我不确定我是否正确理解了您。如果没有,请告诉我删除答案。

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


【解决方案1】:

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

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; }
}

【讨论】:

  • 如果他使用EF,他需要翻译成sql。这种方法仅适用于 linq to objects。
  • 它也适用于 EF。他需要使用 context 和 table 而不是 List。
  • 您好,感谢您的回答。但我认为 take(2) 意味着只取两条记录,对吗?你能看看我的最新情况吗?
  • 我发布答案后,您更改为此。我需要再次检查详细信息。 StackOverflow 的良好做法是不要通过重大更新来改变问题。如果可能,我会尽快回复您。
【解决方案2】:
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;
}   

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多