我正在创建一个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}方法?
谢谢!
答案 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
这里有里程吗?