从密码查询返回通用类型
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
这里面有里程数吗?
我正在创建一个 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
这里面有里程数吗?