2015-01-15 28 views
0

我正在创建一个asp.net web api。许多路由都使用不同的节点对象来做同样的事情。我想从BaseRepository类创建一个基础模型,并且只需要使用子类来投射并返回对象。从密码查询返回泛型类型

例如。 GET api/{controller} 在这个密码查询中唯一改变的是容易作为参数提供的节点的标签。

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

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

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

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 

在这里的任何里程?

+0

你是男人(或女人),现在工作完美!我不能够感谢你! – elo

+0

不用担心!它是一个人btw! :) – ceej