从cypher查询返回泛型类型

时间:2015-01-15 21:28:17

标签: neo4j neo4jclient

我正在创建一个asp.net web api。许多路由都做同样的事情,只是使用不同的节点对象。我想从BaseRepository类创建一个基本模型,只需要对子类进行强制转换并返回对象。

例如。 GET api / {controller} 在这个cypher查询中唯一改变的是节点的Label,它很容易作为参数提供。

我尝试了很多很多方法,例如。

var query = client
            .Cypher
            .Match(string.Format("(node:{0})", label))
            .Return(node => node.As<Node<object.GetType()>>())
            .Limit(10)
            .Results;

但是lambda不接受这一点。我试过了

.Return(node => node.As<Node<string>>())

并将其转换为对象类型和动态,但它表示我也不能这样做。

无论如何要做我在这里尝试的事情,或者可能会建议另一条途径,以便我不必完全以相同的方式编写几十个GET api / {controller}方法?

谢谢!

1 个答案:

答案 0 :(得分:0)

我在一些解决方案中使用泛型采用了类似的方法。您的类型是否与您的标签相符?如果是这样,我想知道这种方法是否可以解决您的问题?

public T GetNode<T>(Guid nodeId)
{
    // derive the label from the type name
    var label = typeof(T).Name;
    // now build the query
    var query = client.Cypher
        .Match(string.Concat("(node:", label, " { nodeid : {nodeid} })"))
        .WithParams(new { nodeid = nodeId })
        .Return(node => node.As<T>())
        .Limit(10)
        .Results;

    // now do something with the results
}

显然,这是使用模式索引来搜索特定节点,但您可以省略该部分,例如

    // derive the label from the type name
    var label = typeof(T).Name;
    // now build the query
    var query = client.Cypher
        .Match(string.Concat("(node:", label, ")"))
        .Return(node => node.As<T>())
        .Limit(10)
        .Results;

    // now do something with the results

这里有里程吗?