2017-08-16 1 views
0

J'essaie d'obtenir tous les éléments d'un certain type de document, qui sont étiquetés de la même manière que l'un des points du nœud/élément actuel.Pour une boucle avec Umbraco TagQuery avec plusieurs points pour obtenir des nœuds/éléments associés

je peux obtenir tous les éléments connexes de une étiquette par ce déclarant explicitement via:

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

Mais, comme GetContentByTag ne prend qu'un seul argument, je ne suis pas sûr de savoir comment structurer la boucle foreach utiliser ma liste de tags

Je voudrais créer une boucle foreach qui aboutit à une liste d'éléments associés qui combine tous les éléments associés de chaque variable, de sorte que je puisse ensuite la commander avec .OrderBy("Id descending").

Voici mon code actuel statique qui fonctionne:

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> 
} 

Mon échec des tentatives de construire la boucle:

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> 
} 

Merci pour toute aide et laissez-moi savoir si je suis pas clair ou besoin plus d'informations.

Répondre

0

J'ai été capable de construire correctement la boucle foreach pour créer la liste, puis traiter la liste pour supprimer les doublons et les classer comme je le voulais. Espérons que cela aide quelqu'un d'autre. Doute c'est le moyen le plus efficace de le faire, mais ça fonctionne.

code:

// 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> 
    }