我在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
结果:
答案 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