Попытка использовать linq для поиска по таблице с иерархическими данными - PullRequest
0 голосов
/ 12 октября 2009

Дубликат во много раз больше (а также эти )

У меня есть таблица Types со следующими столбцами.

ID уровень название ParentID (идентификатор родительской строки)

и таблица с именем ParentObject, которая имеет следующие столбцы. Я БЫ TypeID

Есть 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 я сохраняю дерево, просто сохраняя идентификатор самого низкого уровня. Так что, если у меня есть 4 ID, я знаю, что дерево на самом деле идет Уровень 0 -> Уровень 1 -> Уровень 2 -> Уровень 3

По сути, мне нужно иметь возможность искать все объекты определенного типа или типа 2, например, в операторе linq.

Скажите, что TypeID, хранящийся в таблице ParentObject, равен 4, поэтому Level3.

Но я на самом деле хочу найти все ParentObjects, у которых тип уровня 2 имеет идентификатор 3.

Каков наилучший способ сделать это, поскольку сохраненный идентификатор может быть level1 или level2 и т. Д .?

Предпочтительно в одном выражении linq, если это возможно.

1 Ответ

0 голосов
/ 13 октября 2009

В SQL (MS SQL Server 2005+) вы можете использовать Общее табличное выражение для реализации рекурсии. LINQ не поддерживает CTE. Чтобы обойти эту хранимую процедуру и сопоставить ее в качестве метода с вашим контекстом данных, можно воспользоваться несколькими обходными путями.

Другим решением было бы написать SQL непосредственно в коде C # и заставить LINQ его выполнить. См. это .

Или вы могли бы написать немного кода C #, который выбирает из ваших данных, пока не останется больше родительских идентификаторов. Грубый пример будет ...

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

Надеюсь, это поможет!

...