【问题标题】:For Loop Using Umbraco TagQuery with Multiple Tags to Get Related Nodes/ItemsFor 循环使用带有多个标签的 Umbraco TagQuery 来获取相关节点/项目
【发布时间】:2017-08-16 18:23:37
【问题描述】:

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

我可以通过以下方式显式声明 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>
}

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

【问题讨论】:

    标签: c# for-loop foreach umbraco umbraco7


    【解决方案1】:

    我能够正确构造 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>
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-23
      • 2021-03-02
      • 1970-01-01
      相关资源
      最近更新 更多