diff --git a/src/Umbraco.Tests/PublishedContent/DynamicPublishedContentTests.cs b/src/Umbraco.Tests/PublishedContent/DynamicPublishedContentTests.cs index 9280c176bb..106996a93e 100644 --- a/src/Umbraco.Tests/PublishedContent/DynamicPublishedContentTests.cs +++ b/src/Umbraco.Tests/PublishedContent/DynamicPublishedContentTests.cs @@ -1,3 +1,4 @@ +using System; using System.IO; using System.Linq; using NUnit.Framework; @@ -31,7 +32,50 @@ namespace Umbraco.Tests.PublishedContent return GetNode(id).AsDynamic(); } - [Test] + [Test] + public void FirstChild() + { + var content = GetDynamicNode(1173); + + var x = content.FirstChild(); + Assert.IsNotNull(x); + Assert.IsInstanceOf(x); + Assert.AreEqual(1174, x.Id); + + x = content.FirstChild("CustomDocument"); + Assert.IsNotNull(x); + Assert.IsInstanceOf(x); + Assert.AreEqual(1177, x.Id); + } + + [Test] + public void Children() + { + var content = GetDynamicNode(1173); + + var l = content.Children; + Assert.AreEqual(4, l.Count()); + + // works - but not by calling the extension method + // because the binder will in fact re-route to the property first + l = content.Children(); + Assert.AreEqual(4, l.Count()); + } + + [Test] + public void ChildrenOfType() + { + var content = GetDynamicNode(1173); + + var l = content.Children; + Assert.AreEqual(4, l.Count()); + + // fails - because it fails to find extension methods? + l = content.Children("CustomDocument"); + Assert.AreEqual(2, l.Count()); + } + + [Test] public void Custom_Extension_Methods() { var asDynamic = GetDynamicNode(1173); diff --git a/src/Umbraco.Web/Dynamics/ExtensionMethods.cs b/src/Umbraco.Web/Dynamics/ExtensionMethods.cs index dd3d2f69cd..16eb3e9077 100644 --- a/src/Umbraco.Web/Dynamics/ExtensionMethods.cs +++ b/src/Umbraco.Web/Dynamics/ExtensionMethods.cs @@ -27,5 +27,15 @@ namespace Umbraco.Web.Dynamics { return source.Items.OrderBy(x => Guid.NewGuid()); } + + public static DynamicPublishedContentList Children(this DynamicPublishedContent content) + { + return content.Children; + } + + public static DynamicPublishedContentList Children(this DynamicPublishedContent content, string contentTypeAlias) + { + return new DynamicPublishedContentList(content.PublishedContent.Children().OfTypes(contentTypeAlias)); + } } } diff --git a/src/Umbraco.Web/Models/DynamicPublishedContent.cs b/src/Umbraco.Web/Models/DynamicPublishedContent.cs index 4cb2402e9b..b819376187 100644 --- a/src/Umbraco.Web/Models/DynamicPublishedContent.cs +++ b/src/Umbraco.Web/Models/DynamicPublishedContent.cs @@ -1254,6 +1254,16 @@ namespace Umbraco.Web.Models { get { return _children ?? (_children = new DynamicPublishedContentList(PublishedContent.Children)); } } + + public DynamicPublishedContent FirstChild() + { + return Children.FirstOrDefault(); + } + + public DynamicPublishedContent FirstChild(string alias) + { + return Children.FirstOrDefault(x => x.DocumentTypeAlias == alias) as DynamicPublishedContent; + } #endregion diff --git a/src/Umbraco.Web/PublishedContentExtensions.cs b/src/Umbraco.Web/PublishedContentExtensions.cs index b96c04f752..c771debbad 100644 --- a/src/Umbraco.Web/PublishedContentExtensions.cs +++ b/src/Umbraco.Web/PublishedContentExtensions.cs @@ -1641,6 +1641,22 @@ namespace Umbraco.Web return content.Children().OfType(); } + public static IPublishedContent FirstChild(this IPublishedContent content) + { + return content.Children().First(); + } + + public static IPublishedContent FirstChild(this IPublishedContent content, Func predicate) + { + return content.Children(predicate).FirstOrDefault(); + } + + public static IPublishedContent FirstChild(this IPublishedContent content) + where T : class, IPublishedContent + { + return content.Children().FirstOrDefault(); + } + /// /// Gets the children of the content in a DataTable. ///