umbraco - how to get all of nodes by Document Type

13,944

Solution 1

You can use the uQuery GetNodesByType(string or int) method:

IEnumerable<Node> nodes = uQuery.GetNodesByType("s3Article");

Alternatively, you can use an extension method to get all descendant nodes and then query them by type as in the following answer:

Umbraco 4.6+ - How to get all nodes by doctype in C#?


You could use this to databind to a control within a usercontrol like so:

lvArticles.DataSource = nodes.Select(n => new {
    ID: n.Id,
    Title: n.GetProperty("title").Value,
    Author: n.GetProperty("author").Value,
    Article: n.GetProperty("article").Value,
    Image: n.GetProperty("img").Value,
});
lvArticles.DataBind();

Only you would need to strip the html, convert the image id to a url, etc. within the select statement as well...

Solution 2

As Shannon Deminick mentions, uQuery is somewhat obsolete. ExamineManager will be the fastest execution time. https://our.umbraco.org/forum/developers/api-questions/45777-uQuery-vs-Examine-vs-IPublishedContent-for-Querying

I also found it to be the easiest and most readable approach to use ExamineManager's search builder. Very flexible, and has the added benefit of being very readable due to the Fluent Builder pattern the U Team used.

This will search ALL nodes, so if you need within a specific branch, you can use .ParentId(1234) etc.

var query = ExamineManager.Instance.CreateSearchCriteria()
                          .NodeTypeAlias("yourDocumentType")
                          .Compile();

IEnumerable<IPublishedContent> myNodes = Umbraco.TypedSearch(query);

I prefer typed nodes, but you can also just use "Search()" instead of "TypedSearch()" if you prefer dynamic nodes.

Another example including a specific property value "myPropValue" == "ABC",

var query = ExamineManager.Instance.CreateSearchCriteria()
                    .NodeTypeAlias("yourDocumentType")
                    .Or() //Other predicate .And, .Not etc. 
                    .Field("myPropValue", "ABC")
                    .Compile();

Ref - https://our.umbraco.org/documentation/reference/querying/umbracohelper/

Share:
13,944
whoah
Author by

whoah

.NET Developer Also Manchester United fan :-)

Updated on June 29, 2022

Comments

  • whoah
    whoah almost 2 years

    How can I get all nodes by specific Document Type?

    For example, I want to get in code behind all of nodes with Document Type: s3Article. How can I do this?


    New informations:

        IEnumerable<Node> nodes = uQuery.GetNodesByType("s3Article").Where(x => x.NiceUrl.Contains("en"));
    
        lvArticles.DataSource = nodes;
        lvArticles.DataBind();
    

    This is my code. I had to use Where(x => x.NiceUrl.Contains("en")), because I have 2 language version- without Where I receive nodes from all catalogues with doctype s3Article, but I want to get only from one language version.

    Problem is here:

    <a href='<%# umbraco.library.NiceUrl(Tools.NumericTools.tryParseInt( Eval("id"))) %>'><%# Eval("title")%></a>
    <%# Tools.TextTools.makeIMGHTML("../.."+ Eval("img").ToString(),"180") %>
    <%# umbraco.library.StripHtml(Limit(Eval("Article"), 1000))%>
    <%# Eval("author")%>
    

    System.Web.HttpException: DataBinding: 'umbraco.presentation.nodeFactory.Node' does not contain a property named 'title'.

    The same problem happens with the title, img, article, author. Only ID works nice. How to resolve it?