将嵌套关系模型转换为字符串

时间:2015-03-14 17:23:08

标签: c# asp.net-mvc entity-framework lambda

我在MVC5实体框架中有一个数据模型,其中一个帖子有一个类别。此类别可以嵌套,例如。

Top Level: 0
  -> Lower Level: 1
      -> Lowest Level: 2

这在我的模型中表示为:

public class CategoryModel
{
   public int Id { get; set; }
   public CategoryModel ParentCategory { get; set; }

   public string Title { get; set; }
}

现在当我显示我的帖子(来自上面的例子)类别“最低等级2”时,我想显示

  

“顶级:0>较低级别:1>最低级别:2”

在该页面的某个位置通知用户他们在哪里。

问题是我不知道如何做到这一点。 非常简单(就像lambda中的所有内容一样)但我真的不知道如何以及我的谷歌搜索技巧真的没有。

根据评论问题进行修改: 帖子定义如下:

public class PostModel
{
    public int Id { get; set; }
    public CategoryModel Category { get; set; } // a post can only have one category
    public string Text { get; set; }
}

我想要做的是遵循CategoryModel关系,然后继续关注类别ParentCategory,直到它为空。这始终是1比1的关系。

更多编辑: 我很容易用TSQL-CTE表达式做到这一点,但仍然不知道如何将它转换为lambda。

SQL:

;WITH Hierarchy(Title, CatId, LEVEL, CategoryPath)
AS
(
  Select c.Title, c.Id, 0, c.Title
    FROM Categories c
    WHERE c.[ParentCategory_Id] IS NULL
  UNION ALL
  SELECT c.Title, c.Id, H.LEVEL+1, H.CategoryPath+' > '+c.Title
    FROM Categories c
    INNER JOIN Hierarchy H ON H.CatId = c.[ParentCategory_Id]
)

SELECT SPACE(LEVEL*4) + H.Title, *
FROM Hierarchy H
ORDER BY H.CategoryPath

结果:

enter image description here

1 个答案:

答案 0 :(得分:2)

假设您有一个CategoryModel实例,您可以编写一个函数来构建一个包含所有标题链的字符串列表:

private void FormatCategories(CategoryModel model, List<string> result)
{
    result.Add(model.Title);
    if (model.ParentCategory != null)
    {
        FormatCategories(model.ParentCategory, result);
    }
}

然后:

CategoryModel model = ... // fetch your model from wherever you are fetching it
var result = new List<string>();
FormatCategories(model, result);

现在剩下的就是颠倒列表中元素的顺序并加入它们以检索最终结果:

result.Reverse();
string formattedCategories = string.Join(" -> ", result);
// At this stage formattedCategories should contain the desired result