Получить повторяющийся дочерний результат по уровню глубины - PullRequest
0 голосов
/ 01 июня 2018

Я «гуглил» много часов, но все равно не могу найти ответ.По сути, у меня есть таблица, которая выглядит следующим образом:

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

Как я могу использовать entity 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

Спасибо за вашу помощь

Ответы [ 2 ]

0 голосов
/ 01 июня 2018
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;
}   
0 голосов
/ 01 июня 2018

Мне надоело моделировать ваш сценарий в консольном приложении.Ниже приведено одно из возможных решений.Он очень простой, поэтому вам нужно изменить его и использовать по мере необходимости.Но он возвращает результаты в соответствии с логикой, которую вы упоминаете в своем вопросе.

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; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...