【问题标题】:Creating a breadcrumb like hierarchy using LINQ使用 LINQ 创建类似面包屑的层次结构
【发布时间】:2011-09-18 09:18:04
【问题描述】:

我正在构建一个类似于 Dropbox 的应用程序来存储图像。

我有一个名为 Images 的数据库表:

ImageId [PK]
ParentImageId [FK]
Name
Path

我想从上述结构创建一个面包屑,假设我有以下数据:

是否有可能使用 LINQ 创建一个看起来像这样的面包屑(如果我在子文件夹 2 中) :

Folder 1 > Sub Folder 1 > Sub Folder 2

如何构建查询以返回所需的结果?任何帮助都会有很大帮助!

【问题讨论】:

  • 你的意思是 LINQ to SQL 还是 LINQ to Objects?
  • 真的,我的数据来源于使用 EF4 的 sql db 来返回数据
  • 好的,如果我使用 EF4 来取回数据,那么 linq to sql 是否相同?

标签: c# .net linq linq-to-entities breadcrumbs


【解决方案1】:

使用实体框架,您可以执行以下操作:

代码将如下所示:

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

【讨论】:

    【解决方案2】:

    这样就可以了:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-10
      • 1970-01-01
      相关资源
      最近更新 更多