Get page url from RetrieveContentOfContentTypes

2025/11/18 10:09 PM

I have been trying to retrieve some content and the url of web pages in XbyK for multiple content types using RetrieveContentOfContentTypes.

It threw error if I use "IWebPageFieldsSource" as Model of the final retrieved results.

var contentTypes = new[] { NewsArticle.CONTENT_TYPE_NAME, ContentPage.CONTENT_TYPE_NAME };

var parameters = new RetrieveContentOfContentTypesParameters
{
    LinkedItemsMaxLevel = 1,
    IncludeUrlPath = true,
};

var items = await contentRetriever.RetrieveContentOfContentTypes<IWebPageFieldsSource>(
    contentTypes,
    parameters,
    query => query.Where(where =>
        where.WhereIn(nameof(IContentQueryDataContainer.ContentItemGUID), ids)
    ),
    cacheService.RetrievalCacheSettings(
        $"{nameof(CoreContentModel)}|multi:{string.Join(',', contentTypes)}|ids:{string.Join(',', ids)}"
    ), 
    cancellationToken);

Furthermore, even if I use "IContentItemFieldsSource" as Model of the final retrieved results, it throws error. However, if I map to custom model it works fine, but I am not able to get the url of the page. Is there some ways to get the url of the page using RetrieveContentOfContentTypes.

Tags:
Content querying Content types Object querying C#

Answers

2025/11/19 4:33 AM
Accepted answer

I have resolved as follows:

var retrievedPages = await contentRetriever.RetrieveContentOfContentTypes<CoreContentModel>(
    contentTypes,
    parameters,
    query => query
    .Where(where => where.WhereIn(nameof(IContentQueryDataContainer.ContentItemGUID), contentIds))
    .TopN(10),
    cacheService.RetrievalCacheSettings(
        $"{string.Join(',', contentTypes)}|ids:{string.Join(',', contentIds)}"
    ),
    // custom mapping hook to get page url from WebPageFields
    configureModel: async (source, model) =>
    {
        var url = model.SystemFields?.WebPageUrlPath;
        model.Url = url ?? string.Empty;
        return model;
    },
    cancellationToken);

return retrievedPages;

To response this discussion, you have to login first.