翁布拉科4.6+;-如何在C#中通过doctype获取所有节点?

翁布拉科4.6+;-如何在C#中通过doctype获取所有节点?,c#,api,umbraco,C#,Api,Umbraco,使用Umbraco 4.6+,是否有办法检索C#中特定doctype的所有节点?我一直在查找umbraco.NodeFactory名称空间,但还没有找到任何有用的名称空间。我今天刚刚这么做,下面的代码应该可以使用(使用umbraco.presentation.NodeFactory),使用nodeId-1调用它以获取站点的根节点,并让它继续工作: private void DoSomethingWithAllNodesByType(int NodeId, string typeName) {

使用Umbraco 4.6+,是否有办法检索C#中特定doctype的所有节点?我一直在查找
umbraco.NodeFactory
名称空间,但还没有找到任何有用的名称空间。

我今天刚刚这么做,下面的代码应该可以使用(使用umbraco.presentation.NodeFactory),使用nodeId-1调用它以获取站点的根节点,并让它继续工作:

private void DoSomethingWithAllNodesByType(int NodeId, string typeName)
{
    var node = new Node(nodeId);
    foreach (Node childNode in node.Children)
    {
        var child = childNode;
        if (child.NodeTypeAlias == typeName)
        {
            //Do something
        }

        if (child.Children.Count > 0)
            GetAllNodesByType(child, typeName);
    }
}

或递归方法:

using umbraco.NodeFactory;

private static List<Node> FindChildren(Node currentNode, Func<Node, bool> predicate)
{
    List<Node> result = new List<Node>();

    var nodes = currentNode
        .Children
        .OfType<Node>()
        .Where(predicate);
    if (nodes.Count() != 0)
        result.AddRange(nodes);

    foreach (var child in currentNode.Children.OfType<Node>())
    {
        nodes = FindChildren(child, predicate);
        if (nodes.Count() != 0)
            result.AddRange(nodes);
    }
    return result;
}

void Example()
{
    var nodes = FindChildren(new Node(-1), t => t.NodeTypeAlias.Equals("myDocType"));
    // Do something...
}
使用umbraco.NodeFactory;
私有静态列表FindChildren(节点currentNode,Func谓词)
{
列表结果=新列表();
变量节点=当前节点
儿童
第()类
.Where(谓语);
如果(nodes.Count()!=0)
结果.AddRange(节点);
foreach(currentNode.Children.OfType()中的var child)
{
节点=FindChildren(子节点,谓词);
如果(nodes.Count()!=0)
结果.AddRange(节点);
}
返回结果;
}
void示例()
{
var nodes=FindChildren(新节点(-1),t=>t.NodeTypeAlias.Equals(“myDocType”);
//做点什么。。。
}

假设您最终只需要两个特定类型的节点,那么使用yield关键字来避免检索比您必须检索的更多的节点会更有效:

public static IEnumerable<INode> GetDescendants(this INode node)
{
    foreach (INode child in node.ChildrenAsList)
    {
        yield return child;

        foreach (INode grandChild in child.GetDescendants())
        {
            yield return grandChild;
        }
    }
    yield break;
}

因此,如果您只想得到前五个结果,可以将.Take(5)添加到末尾,您将只递归前五个结果,而不是拉出整个树。

如果您只是创建一个宏使用的razor脚本文件(Umbraco 4.7+),我发现这个速记特别有用

var nodes = new Node(-1).Descendants("DocType").Where("Visible");

希望这对别人有帮助

在umbraco 7.0+中,您可以这样做

foreach (var childNode in node.Children<ChildNodeType>())
{
...
}
foreach(node.Children()中的var childNode)
{
...
}

使用-1作为id来获取站点的根节点是一个很好的技巧!谢谢你
foreach (var childNode in node.Children<ChildNodeType>())
{
...
}