Kontakt oss
Tilbake til bloggen
Innsikt

Performance tip when using GetDescendents for catalog content

Here's a quick performance tip when you are using GetDescendents to load all catalog content of a certain type.

Performance tip when using GetDescendents for catalog content

To load all catalog nodes for example, you would probably be tempted to use something similar to the following code:

public class CatalogContentLoader
{
    private readonly IContentLoader _contentLoader;
    private readonly ReferenceConverter _referenceConverter;

    public CatalogContentLoader(
        IContentLoader contentLoader,
        ReferenceConverter referenceConverter)
    {
        _contentLoader = contentLoader;
        _referenceConverter = referenceConverter;
    }

    public IEnumerable<NodeContent> GetAllNodes()
    {
        var allCatalogContentLinks = _contentLoader
            .GetDescendents(_referenceConverter.GetRootLink());

        return _contentLoader
            .GetItems(allCatalogContentLinks, CultureInfo.InvariantCulture)
            .OfType<NodeContent>();
    }
}

There is a better way through a performance perspective though. In the slightly modified code below, we filter the list of content links to only contain references to catalog nodes, which will probably reduce number of items to be fetched significantly:

public IEnumerable<NodeContent> GetAllNodes()
{
    var allCatalogNodeContentLinks = _contentLoader
        .GetDescendents(_referenceConverter.GetRootLink())
        .Where(x => IsCatalogContentType(x, CatalogContentType.CatalogNode));

    return _contentLoader
        .GetItems(allCatalogNodeContentLinks, CultureInfo.InvariantCulture)
        .OfType<NodeContent>();
}

private bool IsCatalogContentType(
    ContentReference contentLink,
    CatalogContentType catalogContentType)
{
    return _referenceConverter.GetContentType(contentLink) == catalogContentType;
}

If you want to fetch all variations you could instead filter on CatalogContentType.CatalogEntry. Probably not a huge performance improvement, but still:

public IEnumerable<VariationContent> GetAllVariants()
{
    var allCatalogEntryContentLinks = _contentLoader
        .GetDescendents(_referenceConverter.GetRootLink())
        .Where(x => IsCatalogContentType(x, CatalogContentType.CatalogEntry));

    return _contentLoader
        .GetItems(allCatalogEntryContentLinks, CultureInfo.InvariantCulture)
        .OfType<VariationContent>();
}

Snakk med oss

Har du et prosjekt vi kan hjelpe med?

Ta en uforpliktende prat med teamet vårt om hvordan vi kan løse din utfordring.

Ta kontakt

Hold deg oppdatert på fremtidens e-handel

Ukentlige analyser, trender og praktiske råd — kun det vi selv ville lest.