Создание иерархии, похожей на крошку, используя LINQ - PullRequest
3 голосов
/ 18 сентября 2011

Я создаю Dropbox-подобное приложение для хранения изображений.

У меня есть таблица базы данных с именем Images:

ImageId [PK]
ParentImageId [FK]
Name
Path

Я хочу создать крошку из приведенной выше структуры:скажем, у меня есть следующие данные:

enter image description here

Возможно ли с помощью LINQ создать крошку, которая выглядит как (если я в подпапке 2):

Folder 1 > Sub Folder 1 > Sub Folder 2

Как мне построить запрос для получения желаемых результатов?Любая помощь будет очень полезна!

Ответы [ 2 ]

5 голосов
/ 18 сентября 2011

С Entity Framework вы можете сделать следующее:

enter image description here

И код будет выглядеть так:

var image = db.Images.FirstOrDefault(i => i.Id == currImageId);

var imagesHierarchy = new List<Image>();
if (image != null)
{
    var parent = image.Parent;
    while (parent != null)
    {
        imagesHierarchy.Insert(0, parent);
        parent = parent.Parent;
    }
}

var breadcrumb = string.Join(" > ", imagesHierarchy.Select(i => i.Name));
1 голос
/ 18 сентября 2011

Это будет сделано:

var current = new Record
    { ImageId = 4, ParentImageId = 3, Name = "Sub Folder 2" };

var records = new []
{
    new Record { ImageId = 1, ParentImageId = 1, Name = "Folder 1" },
    new Record { ImageId = 2, ParentImageId = 1, Name = "Image 1" },
    new Record { ImageId = 3, ParentImageId = 1, Name = "Sub Folder 1" },
    current,
    new Record { ImageId = 5, ParentImageId = 4, Name = "Sub Image" },
};

var index = records.ToDictionary(r => r.ImageId);

Func<Record, IEnumerable<Record>> traverseUp = null;
traverseUp = r =>
{
    var rs = new [] { r, };
    if (r.ParentImageId == r.ImageId)
    {
        return rs;
    }
    else
    {
        return traverseUp(index[r.ParentImageId]).Concat(rs);
    }
};

var breadcrumb = String.Join(" > ", traverseUp(current).Select(r => r.Name));
...