从密码查询返回通用类型

Returning generic type from cypher query

我正在创建一个 asp.net 网站 api。许多路由都做同样的事情,只是节点 object 不同。我想从 BaseRepository class 创建一个基础模型,并简单地使用 child class 和 return object(s).

例如。获取 api/{控制器} 在这个密码查询中唯一改变的是节点的标签,它很容易作为参数提供。

我已经尝试了很多很多方法来做到这一点,例如。

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>>())

并将其转换为 object 类型和动态,但它说我也不能那样做。

有没有办法做我在这里尝试的事情,或者可以建议其他途径,这样我就不必以完全相同的方式编写几十个 GET api/{controller} 方法?

谢谢!

我在一些解决方案中通过使用泛型采取了类似的方法。你的类型是否符合你的标签?如果是这样,我想知道这种方法是否可以在某种程度上解决您的问题?

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

这里面有里程数吗?