3

I'm building a dropbox -like application to store images.

I have a database table called Images:

ImageId [PK]
ParentImageId [FK]
Name
Path

I want to create a breadcrumb from the above structure lets say I have the following data:

enter image description here

Is it possible using LINQ to be able to create a breadcrumb that looks like (if I am at sub folder 2) :

Folder 1 > Sub Folder 1 > Sub Folder 2

How do I build a query to return the desired results? Any assistance would be of great help!

abatishchev
  • 98,240
  • 88
  • 296
  • 433
Diver Dan
  • 9,953
  • 22
  • 95
  • 166

2 Answers2

5

With Entity Framework you can do next:

enter image description here

And code will look like this:

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));
Dmitry
  • 452
  • 1
  • 3
  • 10
1

This will do it:

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));
Enigmativity
  • 113,464
  • 11
  • 89
  • 172