2015-01-15 64 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