For 循环使用 Umbraco TagQuery 和多个标签来获取相关 Nodes/Items

For Loop Using Umbraco TagQuery with Multiple Tags to Get Related Nodes/Items

我正在尝试获取特定文档类型的所有项目,这些项目的标签与当前 node/item 上的其中一个标签相同。

我可以通过以下方式显式声明来获取 one 标签的所有相关项目:

var taggedContent = Umbraco.TagQuery.GetContentByTag("Tag1");
var taggedItems = taggedContent.Where(c => c.IsDocumentType("SpecificPageType", true) && c.IsVisible());

但是,由于 GetContentByTag 只接受一个参数,我不确定如何构造 foreach 循环以使用我的标签列表。

我想制作一个 foreach 循环,生成一个相关项目列表,该列表组合了每个标签中的所有相关项目,这样我就可以使用 .OrderBy("Id descending") 对其进行排序。

这是我当前有效的静态代码:

var tags = Umbraco.TagQuery.GetTagsForEntity(Node.getCurrentNodeId()).DistinctBy(t => t.Text).OrderBy(t => t.Text);
var taggedContent = Umbraco.TagQuery.GetContentByTag("Tag1");
var taggedItems = taggedContent.Where(c => c.IsDocumentType("SpecificPageType", true) && c.IsVisible());
foreach (var relatedItem in taggedItems)
{
<a href="@relatedItem.Url">
    @{
        var pageTitle = relatedItem.GetPropertyValue("pageTitle").ToString();
    }
    <h6>@Umbraco.Truncate(pageTitle, 80, true)</h6>
</a>
}

我构建循环的失败尝试:

var tags = Umbraco.TagQuery.GetTagsForEntity(Node.getCurrentNodeId()).DistinctBy(t => t.Text).OrderBy(t => t.Text);
var listIWant = new List<IPublishedContent>();

foreach (var tag in tags)
{
var taggedContent = Umbraco.TagQuery.GetContentByTag(tag.ToString());
var taggedItems = taggedContent.Where(c => c.IsDocumentType("SpecificPageType", true) && c.IsVisible());

//How to modify the list here?

}

//OR

var tagsCount = tags.Count();
for (var i = 0; i < tagsCount; i++)
{
var taggedContent = Umbraco.TagQuery.GetContentByTag(tag.ToString());
var taggedItems = taggedContent.Where(c => c.IsDocumentType("SpecificPageType", true) && c.IsVisible());

//How to modify the list here?

}
// Modified the list to contain everything in the loop above, now order it
var orderedList = listIWant.OrderBy("Id descending");
// Create links from ordered list
foreach (var relatedItem in orderedList)
{
<a href="@relatedItem.Url">
    @{
        var pageTitle = relatedItem.GetPropertyValue("pageTitle").ToString();
    }
    <h6>@Umbraco.Truncate(pageTitle, 80, true)</h6>
</a>
}

感谢您的帮助,如果我不清楚或需要更多信息,请告诉我。

我能够正确构建 foreach 循环来创建列表,然后处理列表以删除重复项并按照我的需要进行排序。希望这对其他人有帮助。怀疑这是最有效的方法,但它确实有效。

代码:

    // Get tags of current item I'm on
    var tags = Umbraco.TagQuery.GetTagsForEntity(Node.getCurrentNodeId()).DistinctBy(t => t.Text).OrderBy(t => t.Text);

    // Create blank list to add to in foreach loop
    var combinedList = new List<IPublishedContent>();

    // Get related content by tag for each tag, add to the list
    foreach (var tag in tags)
    {
        var tagString = tag.Text;
        var taggedContent = Umbraco.TagQuery.GetContentByTag(tagString);
        combinedList.AddRange(taggedContent);
    }

    // Filter list to only idea items, order by latest, then remove duplicates
    var taggedItems = combinedList.Where(c => c.IsDocumentType("NewsPage", true) && c.IsVisible() && c.Id != CurrentPage.Id).OrderBy("Id descending").DistinctBy(x => x.Id).Take(8);

    if (taggedItems.Any())
    {
        foreach (var relatedItem in taggedItems)
        {
        <a href="@relatedItem.Url">
        @{
            var pageTitle = relatedItem.GetPropertyValue("pageTitle").ToString();
        }
        <h6>@Umbraco.Truncate(pageTitle, 80, true)</h6>
    </a>
    }