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>
}
我正在尝试获取特定文档类型的所有项目,这些项目的标签与当前 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>
}