diff --git a/src/Umbraco.Core/Extensions/PublishedContentExtensions.cs b/src/Umbraco.Core/Extensions/PublishedContentExtensions.cs index d36158fdcf..86f84e08ab 100644 --- a/src/Umbraco.Core/Extensions/PublishedContentExtensions.cs +++ b/src/Umbraco.Core/Extensions/PublishedContentExtensions.cs @@ -1310,6 +1310,7 @@ public static class PublishedContentExtensions /// The content item. /// /// + /// /// /// The specific culture to get the URL children for. Default is null which will use the current culture in /// @@ -1337,13 +1338,81 @@ public static class PublishedContentExtensions IVariationContextAccessor? variationContextAccessor, IPublishedCache publishedCache, INavigationQueryService navigationQueryService, + IPublishStatusQueryService publishStatusQueryService, string? culture = null) { - IEnumerable children = GetChildren(navigationQueryService, publishedCache, content.Key); + IEnumerable children = GetChildren(navigationQueryService, publishedCache, content.Key, publishStatusQueryService, variationContextAccessor, null, culture); return children.FilterByCulture(culture, variationContextAccessor); } + /// + /// Gets the children of the content item. + /// + /// The content item. + /// + /// + /// + /// The specific culture to get the URL children for. Default is null which will use the current culture in + /// + /// + /// + /// + /// Gets children that are available for the specified culture. + /// Children are sorted by their sortOrder. + /// + /// For culture, + /// if null is used the current culture is used. + /// If an empty string is used only invariant children are returned. + /// If "*" is used all children are returned. + /// + /// + /// If a variant culture is specified or there is a current culture in the then the + /// Children returned + /// will include both the variant children matching the culture AND the invariant children because the invariant + /// children flow with the current culture. + /// However, if an empty string is specified only invariant children are returned. + /// + /// + [Obsolete("Use the overload with IPublishStatusQueryService, scheduled for removal in v17")] + public static IEnumerable Children( + this IPublishedContent content, + IVariationContextAccessor? variationContextAccessor, + IPublishedCache publishedCache, + INavigationQueryService navigationQueryService, + string? culture = null) + { + IPublishStatusQueryService publishStatusQueryService = StaticServiceProvider.Instance.GetRequiredService(); + return Children(content, variationContextAccessor, publishedCache, navigationQueryService, publishStatusQueryService, culture); + } + + /// + /// Gets the children of the content, filtered by a predicate. + /// + /// The content. + /// The accessor for VariationContext + /// + /// + /// The predicate. + /// + /// The specific culture to filter for. If null is used the current culture is used. (Default is + /// null) + /// + /// + /// The children of the content, filtered by the predicate. + /// + /// Children are sorted by their sortOrder. + /// + public static IEnumerable Children( + this IPublishedContent content, + IVariationContextAccessor variationContextAccessor, + IPublishedCache publishedCache, + INavigationQueryService navigationQueryService, + IPublishStatusQueryService publishStatusQueryService, + Func predicate, + string? culture = null) => + content.Children(variationContextAccessor, publishedCache, navigationQueryService, publishStatusQueryService, culture).Where(predicate); + /// /// Gets the children of the content, filtered by a predicate. /// @@ -1360,6 +1429,7 @@ public static class PublishedContentExtensions /// /// Children are sorted by their sortOrder. /// + [Obsolete("Use the overload with IPublishStatusQueryService, scheduled for removal in v17")] public static IEnumerable Children( this IPublishedContent content, IVariationContextAccessor variationContextAccessor, @@ -1382,6 +1452,7 @@ public static class PublishedContentExtensions /// /// The content type alias. /// The children of the content, of any of the specified types. + [Obsolete("Use the overload with IPublishStatusQueryService, scheduled for removal in v17")] public static IEnumerable ChildrenOfType( this IPublishedContent content, IVariationContextAccessor variationContextAccessor, @@ -1389,14 +1460,68 @@ public static class PublishedContentExtensions INavigationQueryService navigationQueryService, string? contentTypeAlias, string? culture = null) + { + IPublishStatusQueryService publishStatusQueryService = StaticServiceProvider.Instance.GetRequiredService(); + return ChildrenOfType(content, variationContextAccessor, publishedCache, navigationQueryService, publishStatusQueryService, contentTypeAlias, culture); + } + + /// + /// Gets the children of the content, of any of the specified types. + /// + /// The content. + /// + /// + /// + /// The accessor for the VariationContext + /// + /// The specific culture to filter for. If null is used the current culture is used. (Default is + /// null) + /// + /// The content type alias. + /// The children of the content, of any of the specified types. + public static IEnumerable ChildrenOfType( + this IPublishedContent content, + IVariationContextAccessor variationContextAccessor, + IPublishedCache publishedCache, + INavigationQueryService navigationQueryService, + IPublishStatusQueryService publishStatusQueryService, + string? contentTypeAlias, + string? culture = null) { IEnumerable children = contentTypeAlias is not null - ? GetChildren(navigationQueryService, publishedCache, content.Key, contentTypeAlias) + ? GetChildren(navigationQueryService, publishedCache, content.Key, publishStatusQueryService, variationContextAccessor, contentTypeAlias, culture) : []; return children.FilterByCulture(culture, variationContextAccessor); } + /// + /// Gets the children of the content, of a given content type. + /// + /// The content type. + /// The content. + /// The accessor for the VariationContext + /// + /// + /// + /// The specific culture to filter for. If null is used the current culture is used. (Default is + /// null) + /// + /// + /// The children of content, of the given content type. + /// + /// Children are sorted by their sortOrder. + /// + public static IEnumerable Children( + this IPublishedContent content, + IVariationContextAccessor variationContextAccessor, + IPublishedCache publishedCache, + INavigationQueryService navigationQueryService, + IPublishStatusQueryService publishStatusQueryService, + string? culture = null) + where T : class, IPublishedContent => + content.Children(variationContextAccessor, publishedCache, navigationQueryService, publishStatusQueryService, culture).OfType(); + /// /// Gets the children of the content, of a given content type. /// @@ -1413,6 +1538,7 @@ public static class PublishedContentExtensions /// /// Children are sorted by their sortOrder. /// + [Obsolete("Use the overload with IPublishStatusQueryService, scheduled for removal in v17")] public static IEnumerable Children( this IPublishedContent content, IVariationContextAccessor variationContextAccessor, @@ -1427,8 +1553,18 @@ public static class PublishedContentExtensions IVariationContextAccessor variationContextAccessor, IPublishedCache publishedCache, INavigationQueryService navigationQueryService, + IPublishStatusQueryService publishStatusQueryService, string? culture = null) => - content.Children(variationContextAccessor, publishedCache, navigationQueryService, culture)?.FirstOrDefault(); + content.Children(variationContextAccessor, publishedCache, navigationQueryService, publishStatusQueryService, culture)?.FirstOrDefault(); + + [Obsolete("Use the overload with IPublishStatusQueryService, scheduled for removal in v17")] + public static IPublishedContent? FirstChild( + this IPublishedContent content, + IVariationContextAccessor variationContextAccessor, + IPublishedCache publishedCache, + INavigationQueryService navigationQueryService, + string? culture = null) => + FirstChild(content, variationContextAccessor, publishedCache, navigationQueryService, StaticServiceProvider.Instance.GetRequiredService(), culture); /// /// Gets the first child of the content, of a given content type. @@ -1438,29 +1574,97 @@ public static class PublishedContentExtensions IVariationContextAccessor variationContextAccessor, IPublishedCache publishedCache, INavigationQueryService navigationQueryService, + IPublishStatusQueryService publishStatusQueryService, string contentTypeAlias, string? culture = null) => content - .ChildrenOfType(variationContextAccessor, publishedCache, navigationQueryService, contentTypeAlias, culture) + .ChildrenOfType(variationContextAccessor, publishedCache, navigationQueryService, publishStatusQueryService, contentTypeAlias, culture) .FirstOrDefault(); + /// + /// Gets the first child of the content, of a given content type. + /// + [Obsolete("Use the overload with IPublishStatusQueryService, scheduled for removal in v17")] + public static IPublishedContent? FirstChildOfType( + this IPublishedContent content, + IVariationContextAccessor variationContextAccessor, + IPublishedCache publishedCache, + INavigationQueryService navigationQueryService, + string contentTypeAlias, + string? culture = null) => + FirstChildOfType( + content, + variationContextAccessor, + publishedCache, + navigationQueryService, + StaticServiceProvider.Instance.GetRequiredService(), + contentTypeAlias, + culture); + + public static IPublishedContent? FirstChild( + this IPublishedContent content, + IVariationContextAccessor variationContextAccessor, + IPublishedCache publishedCache, + INavigationQueryService navigationQueryService, + IPublishStatusQueryService publishStatusQueryService, + Func predicate, + string? culture = null) + => content.Children(variationContextAccessor, publishedCache, navigationQueryService, publishStatusQueryService, predicate, culture)?.FirstOrDefault(); + + [Obsolete("Use the overload with IPublishStatusQueryService, scheduled for removal in v17")] public static IPublishedContent? FirstChild( this IPublishedContent content, IVariationContextAccessor variationContextAccessor, IPublishedCache publishedCache, INavigationQueryService navigationQueryService, Func predicate, - string? culture = null) - => content.Children(variationContextAccessor, publishedCache, navigationQueryService, predicate, culture)?.FirstOrDefault(); + string? culture = null) => + FirstChild( + content, + variationContextAccessor, + publishedCache, + navigationQueryService, + StaticServiceProvider.Instance.GetRequiredService(), + predicate, + culture); public static IPublishedContent? FirstChild( this IPublishedContent content, IVariationContextAccessor variationContextAccessor, IPublishedCache publishedCache, INavigationQueryService navigationQueryService, + IPublishStatusQueryService publishStatusQueryService, Guid uniqueId, string? culture = null) => content - .Children(variationContextAccessor, publishedCache, navigationQueryService, x => x.Key == uniqueId, culture)?.FirstOrDefault(); + .Children(variationContextAccessor, publishedCache, navigationQueryService, publishStatusQueryService, x => x.Key == uniqueId, culture)?.FirstOrDefault(); + [Obsolete("Use the overload with IPublishStatusQueryService, scheduled for removal in v17")] + public static IPublishedContent? FirstChild( + this IPublishedContent content, + IVariationContextAccessor variationContextAccessor, + IPublishedCache publishedCache, + INavigationQueryService navigationQueryService, + Guid uniqueId, + string? culture = null) => + FirstChild( + content, + variationContextAccessor, + publishedCache, + navigationQueryService, + StaticServiceProvider.Instance.GetRequiredService(), + uniqueId, + culture); + + public static T? FirstChild( + this IPublishedContent content, + IVariationContextAccessor variationContextAccessor, + IPublishedCache publishedCache, + INavigationQueryService navigationQueryService, + IPublishStatusQueryService publishStatusQueryService, + string? culture = null) + where T : class, IPublishedContent => + content.Children(variationContextAccessor, publishedCache, navigationQueryService, publishStatusQueryService, culture)?.FirstOrDefault(); + + [Obsolete("Use the overload with IPublishStatusQueryService, scheduled for removal in v17")] public static T? FirstChild( this IPublishedContent content, IVariationContextAccessor variationContextAccessor, @@ -1468,8 +1672,20 @@ public static class PublishedContentExtensions INavigationQueryService navigationQueryService, string? culture = null) where T : class, IPublishedContent => - content.Children(variationContextAccessor, publishedCache, navigationQueryService, culture)?.FirstOrDefault(); + FirstChild(content, variationContextAccessor, publishedCache, navigationQueryService, StaticServiceProvider.Instance.GetRequiredService(), culture); + public static T? FirstChild( + this IPublishedContent content, + IVariationContextAccessor variationContextAccessor, + IPublishedCache publishedCache, + INavigationQueryService navigationQueryService, + IPublishStatusQueryService publishStatusQueryService, + Func predicate, + string? culture = null) + where T : class, IPublishedContent => + content.Children(variationContextAccessor, publishedCache, navigationQueryService, publishStatusQueryService, culture)?.FirstOrDefault(predicate); + + [Obsolete("Use the overload with IPublishStatusQueryService, scheduled for removal in v17")] public static T? FirstChild( this IPublishedContent content, IVariationContextAccessor variationContextAccessor, @@ -1478,7 +1694,14 @@ public static class PublishedContentExtensions Func predicate, string? culture = null) where T : class, IPublishedContent => - content.Children(variationContextAccessor, publishedCache, navigationQueryService, culture)?.FirstOrDefault(predicate); + FirstChild( + content, + variationContextAccessor, + publishedCache, + navigationQueryService, + StaticServiceProvider.Instance.GetRequiredService(), + predicate, + culture); #endregion @@ -1649,6 +1872,7 @@ public static class PublishedContentExtensions /// The content. /// Variation context accessor. /// + /// /// /// The specific culture to filter for. If null is used the current culture is used. (Default is /// null) @@ -1660,6 +1884,7 @@ public static class PublishedContentExtensions IVariationContextAccessor variationContextAccessor, IPublishedCache publishedCache, INavigationQueryService navigationQueryService, + IPublishStatusQueryService publishStatusQueryService, string? culture = null) where T : class, IPublishedContent { @@ -1681,9 +1906,38 @@ public static class PublishedContentExtensions .OfType(); } - return parent.Children(variationContextAccessor, publishedCache, navigationQueryService, culture); + return parent.Children(variationContextAccessor, publishedCache, navigationQueryService, publishStatusQueryService, culture); } + /// + /// Gets the siblings of the content including the node itself to indicate the position, of a given content type. + /// + /// The content type. + /// The content. + /// Variation context accessor. + /// + /// + /// The specific culture to filter for. If null is used the current culture is used. (Default is + /// null) + /// + /// + /// The siblings of the content including the node itself, of the given content type. + [Obsolete("Use the overload with IPublishStatusQueryService, scheduled for removal in v17")] + public static IEnumerable SiblingsAndSelf( + this IPublishedContent content, + IVariationContextAccessor variationContextAccessor, + IPublishedCache publishedCache, + INavigationQueryService navigationQueryService, + string? culture = null) + where T : class, IPublishedContent => + SiblingsAndSelf( + content, + variationContextAccessor, + publishedCache, + navigationQueryService, + StaticServiceProvider.Instance.GetRequiredService(), + culture); + #endregion #region Axes: custom @@ -2047,14 +2301,26 @@ public static class PublishedContentExtensions string? culture = null) => content.Children(variationContextAccessor, GetPublishedCache(content), GetNavigationQueryService(content), culture).Where(predicate); + [Obsolete("Use the overload with IPublishStatusQueryService, scheduled for removal in v17")] public static IEnumerable ChildrenOfType( this IPublishedContent content, IVariationContextAccessor variationContextAccessor, string? contentTypeAlias, string? culture = null) + { + IPublishStatusQueryService publishStatusQueryService = StaticServiceProvider.Instance.GetRequiredService(); + return ChildrenOfType(content, variationContextAccessor, publishStatusQueryService, contentTypeAlias, culture); + } + + public static IEnumerable ChildrenOfType( + this IPublishedContent content, + IVariationContextAccessor variationContextAccessor, + IPublishStatusQueryService publishStatusQueryService, + string? contentTypeAlias, + string? culture = null) { IEnumerable children = contentTypeAlias is not null - ? GetChildren(GetNavigationQueryService(content), GetPublishedCache(content), content.Key, contentTypeAlias) + ? GetChildren(GetNavigationQueryService(content), GetPublishedCache(content), content.Key, publishStatusQueryService, variationContextAccessor, contentTypeAlias, culture) : []; return children.FilterByCulture(culture, variationContextAccessor); @@ -2296,20 +2562,66 @@ public static class PublishedContentExtensions public static IPublishedContent? FirstChild( this IPublishedContent content, IVariationContextAccessor variationContextAccessor, + IPublishStatusQueryService publishStatusQueryService, string? culture = null) => - content.Children(variationContextAccessor, GetPublishedCache(content), - GetNavigationQueryService(content), culture)?.FirstOrDefault(); + content.Children( + variationContextAccessor, + GetPublishedCache(content), + GetNavigationQueryService(content), + publishStatusQueryService, + culture)?.FirstOrDefault(); + + [Obsolete("Use the overload with IPublishStatusQueryService, scheduled for removal in v17")] + public static IPublishedContent? FirstChild( + this IPublishedContent content, + IVariationContextAccessor variationContextAccessor, + string? culture = null) => + FirstChild(content, variationContextAccessor, StaticServiceProvider.Instance.GetRequiredService(), culture); public static IPublishedContent? FirstChildOfType( this IPublishedContent content, IVariationContextAccessor variationContextAccessor, + IPublishStatusQueryService publishStatusQueryService, string contentTypeAlias, string? culture = null) => - content.ChildrenOfType(variationContextAccessor, GetPublishedCache(content), - GetNavigationQueryService(content), contentTypeAlias, culture)?.FirstOrDefault(); + content.ChildrenOfType( + variationContextAccessor, + GetPublishedCache(content), + GetNavigationQueryService(content), + publishStatusQueryService, + contentTypeAlias, + culture)?.FirstOrDefault(); + + [Obsolete("Use the overload with IPublishStatusQueryService, scheduled for removal in v17")] + public static IPublishedContent? FirstChildOfType( + this IPublishedContent content, + IVariationContextAccessor variationContextAccessor, + string contentTypeAlias, + string? culture = null) => + FirstChildOfType( + content, + variationContextAccessor, + StaticServiceProvider.Instance.GetRequiredService(), + contentTypeAlias, + culture); + public static IPublishedContent? FirstChild( + this IPublishedContent content, + IVariationContextAccessor variationContextAccessor, + IPublishStatusQueryService publishStatusQueryService, + Func predicate, + string? culture = null) => + content.Children( + variationContextAccessor, + GetPublishedCache(content), + GetNavigationQueryService(content), + publishStatusQueryService, + predicate, + culture)?.FirstOrDefault(); + + [Obsolete("Use the overload with IPublishStatusQueryService, scheduled for removal in v17")] public static IPublishedContent? FirstChild( this IPublishedContent content, IVariationContextAccessor variationContextAccessor, @@ -2322,20 +2634,70 @@ public static class PublishedContentExtensions public static IPublishedContent? FirstChild( this IPublishedContent content, IVariationContextAccessor variationContextAccessor, + IPublishStatusQueryService publishStatusQueryService, Guid uniqueId, string? culture = null) => content - .Children(variationContextAccessor, GetPublishedCache(content), - GetNavigationQueryService(content), x => x.Key == uniqueId, culture)?.FirstOrDefault(); + .Children( + variationContextAccessor, + GetPublishedCache(content), + GetNavigationQueryService(content), + publishStatusQueryService, + x => x.Key == uniqueId, + culture)?.FirstOrDefault(); + + [Obsolete("Use the overload with IPublishStatusQueryService, scheduled for removal in v17")] + public static IPublishedContent? FirstChild( + this IPublishedContent content, + IVariationContextAccessor variationContextAccessor, + Guid uniqueId, + string? culture = null) => + FirstChild( + content, + variationContextAccessor, + StaticServiceProvider.Instance.GetRequiredService(), + uniqueId, + culture); public static T? FirstChild( this IPublishedContent content, IVariationContextAccessor variationContextAccessor, + IPublishStatusQueryService publishStatusQueryService, string? culture = null) where T : class, IPublishedContent => - content.Children(variationContextAccessor, GetPublishedCache(content), - GetNavigationQueryService(content), culture)?.FirstOrDefault(); + content.Children( + variationContextAccessor, + GetPublishedCache(content), + GetNavigationQueryService(content), + publishStatusQueryService, + culture)?.FirstOrDefault(); + [Obsolete("Use the overload with IPublishStatusQueryService, scheduled for removal in v17")] + public static T? FirstChild( + this IPublishedContent content, + IVariationContextAccessor variationContextAccessor, + string? culture = null) + where T : class, IPublishedContent => + FirstChild( + content, + variationContextAccessor, + StaticServiceProvider.Instance.GetRequiredService(), + culture); + + + public static T? FirstChild( + this IPublishedContent content, + IVariationContextAccessor variationContextAccessor, + IPublishStatusQueryService publishStatusQueryService, + Func predicate, + string? culture = null) + where T : class, IPublishedContent => + content.Children( + variationContextAccessor, + GetPublishedCache(content), + GetNavigationQueryService(content), + publishStatusQueryService, + culture)?.FirstOrDefault(predicate); public static T? FirstChild( this IPublishedContent content, @@ -2343,8 +2705,12 @@ public static class PublishedContentExtensions Func predicate, string? culture = null) where T : class, IPublishedContent => - content.Children(variationContextAccessor, GetPublishedCache(content), - GetNavigationQueryService(content), culture)?.FirstOrDefault(predicate); + FirstChild( + content, + variationContextAccessor, + StaticServiceProvider.Instance.GetRequiredService(), + predicate, + culture); [Obsolete( "Please use IPublishedCache and IDocumentNavigationQueryService or IMediaNavigationQueryService directly. This will be removed in a future version of Umbraco")] @@ -2429,7 +2795,10 @@ public static class PublishedContentExtensions INavigationQueryService navigationQueryService, IPublishedCache publishedCache, Guid parentKey, - string? contentTypeAlias = null) + IPublishStatusQueryService publishStatusQueryService, + IVariationContextAccessor? variationContextAccessor, + string? contentTypeAlias = null, + string? culture = null) { var nodeExists = contentTypeAlias is null ? navigationQueryService.TryGetChildrenKeys(parentKey, out IEnumerable childrenKeys) @@ -2439,8 +2808,14 @@ public static class PublishedContentExtensions { return []; } + // We need to filter what keys are published, as calling the GetById + // with a non-existing published node, will get cache misses and call the DB + // making it a very slow operation. + + culture ??= variationContextAccessor?.VariationContext?.Culture ?? string.Empty; return childrenKeys + .Where(x => publishStatusQueryService.IsDocumentPublished(x, culture)) .Select(publishedCache.GetById) .WhereNotNull(); } diff --git a/src/Umbraco.Web.Common/Extensions/FriendlyPublishedContentExtensions.cs b/src/Umbraco.Web.Common/Extensions/FriendlyPublishedContentExtensions.cs index 97bf4c8839..e25ea4cc4a 100644 --- a/src/Umbraco.Web.Common/Extensions/FriendlyPublishedContentExtensions.cs +++ b/src/Umbraco.Web.Common/Extensions/FriendlyPublishedContentExtensions.cs @@ -67,6 +67,9 @@ public static class FriendlyPublishedContentExtensions private static IMemberTypeService MemberTypeService { get; } = StaticServiceProvider.Instance.GetRequiredService(); + private static IPublishStatusQueryService PublishStatusQueryService { get; } = + StaticServiceProvider.Instance.GetRequiredService(); + private static INavigationQueryService GetNavigationQueryService(IPublishedContent content) { switch (content.ContentType.ItemType) @@ -468,7 +471,7 @@ public static class FriendlyPublishedContentExtensions /// /// public static IEnumerable Children(this IPublishedContent content, string? culture = null) - => content.Children(VariationContextAccessor, GetPublishedCache(content), GetNavigationQueryService(content), culture); + => content.Children(VariationContextAccessor, GetPublishedCache(content), GetNavigationQueryService(content), PublishStatusQueryService, culture); /// /// Gets the children of the content, filtered by a predicate. @@ -487,7 +490,7 @@ public static class FriendlyPublishedContentExtensions this IPublishedContent content, Func predicate, string? culture = null) - => content.Children(VariationContextAccessor, GetPublishedCache(content), GetNavigationQueryService(content), predicate, culture); + => content.Children(VariationContextAccessor, GetPublishedCache(content), GetNavigationQueryService(content), PublishStatusQueryService, predicate, culture); /// /// Gets the children of the content, of any of the specified types. @@ -500,7 +503,7 @@ public static class FriendlyPublishedContentExtensions /// The content type alias. /// The children of the content, of any of the specified types. public static IEnumerable? ChildrenOfType(this IPublishedContent content, string contentTypeAlias, string? culture = null) - => content.ChildrenOfType(VariationContextAccessor, GetPublishedCache(content), GetNavigationQueryService(content), contentTypeAlias, culture); + => content.ChildrenOfType(VariationContextAccessor, GetPublishedCache(content), GetNavigationQueryService(content), PublishStatusQueryService, contentTypeAlias, culture); /// /// Gets the children of the content, of a given content type. @@ -517,30 +520,30 @@ public static class FriendlyPublishedContentExtensions /// public static IEnumerable? Children(this IPublishedContent content, string? culture = null) where T : class, IPublishedContent - => content.Children(VariationContextAccessor, GetPublishedCache(content), GetNavigationQueryService(content), culture); + => content.Children(VariationContextAccessor, GetPublishedCache(content), GetNavigationQueryService(content), PublishStatusQueryService, culture); public static IPublishedContent? FirstChild(this IPublishedContent content, string? culture = null) - => content.FirstChild(VariationContextAccessor, GetPublishedCache(content), GetNavigationQueryService(content), culture); + => content.FirstChild(VariationContextAccessor, GetPublishedCache(content), GetNavigationQueryService(content), PublishStatusQueryService, culture); /// /// Gets the first child of the content, of a given content type. /// public static IPublishedContent? FirstChildOfType(this IPublishedContent content, string contentTypeAlias, string? culture = null) - => content.FirstChildOfType(VariationContextAccessor, GetPublishedCache(content), GetNavigationQueryService(content), contentTypeAlias, culture); + => content.FirstChildOfType(VariationContextAccessor, GetPublishedCache(content), GetNavigationQueryService(content), PublishStatusQueryService, contentTypeAlias, culture); public static IPublishedContent? FirstChild(this IPublishedContent content, Func predicate, string? culture = null) - => content.FirstChild(VariationContextAccessor, GetPublishedCache(content), GetNavigationQueryService(content), predicate, culture); + => content.FirstChild(VariationContextAccessor, GetPublishedCache(content), GetNavigationQueryService(content), PublishStatusQueryService, predicate, culture); public static IPublishedContent? FirstChild(this IPublishedContent content, Guid uniqueId, string? culture = null) - => content.FirstChild(VariationContextAccessor, GetPublishedCache(content), GetNavigationQueryService(content), uniqueId, culture); + => content.FirstChild(VariationContextAccessor, GetPublishedCache(content), GetNavigationQueryService(content), PublishStatusQueryService, uniqueId, culture); public static T? FirstChild(this IPublishedContent content, string? culture = null) where T : class, IPublishedContent - => content.FirstChild(VariationContextAccessor, GetPublishedCache(content), GetNavigationQueryService(content), culture); + => content.FirstChild(VariationContextAccessor, GetPublishedCache(content), GetNavigationQueryService(content), PublishStatusQueryService, culture); public static T? FirstChild(this IPublishedContent content, Func predicate, string? culture = null) where T : class, IPublishedContent - => content.FirstChild(VariationContextAccessor, GetPublishedCache(content), GetNavigationQueryService(content), predicate, culture); + => content.FirstChild(VariationContextAccessor, GetPublishedCache(content), GetNavigationQueryService(content), PublishStatusQueryService, predicate, culture); /// /// Gets the siblings of the content.