2013-02-05 49 views
0

我想從數據庫中檢索Queried類型的所有實體,其中Referenced屬性或其祖先的標籤(意爲referenced.Parent.ChildLabel)等於某個給定標籤值exampleLabel ,有Id等於exampleIdLinq在自引用實體上的查詢條件

我試着使用:

var result = nhibernateSession 
    .Query<Queried>() 
    .Where(queried => queried.SelfReferencing.GetSelfOrAncestor("exampleLabel") == exampleId) 
    .ToList(); 

,但它拋出一個「System.NotSupportedException」,可能是因爲它不知道如何將GetSelfOrAncestor轉換成SQL。

GetSelfOrAncestor(string label)返回SelfReferencing例如在它被調用或它的祖先滿足該this.Parent.ChildLabel等於exampleLabel病症的Id的方法,否則返回0。

例如,下面的圖表如果queried.SelfReferencing在將指向Level 2,GetSelfOrAncestor("exampleLabel")處的對象將返回Level 1處的對象的Id

http://j.mp/Xl86OP

public class Queried 
{ 
    public int Id { get; set; } 
    public SelfReferencing Referenced { get; set; } 
} 

public class SelfReferencing 
{ 
    public SelfReferencing Parent { get; set; } 
    private IList<SelfReferencing > children = new List<SelfReferencing >(); 
    public virtual IList<SelfReferencing > Children 
    { 
     get 
     { 
      return children; 
     } 
     set 
     { 
      children = value; 
     } 
    } 
    public string ChildLabel { get; set; } 
} 

就如何實現這一目標的任何幫助,將不勝感激:)

+0

你能提供一個樣品對象圖嗎?只是爲了看看你的自我參照如何工作。你的父母可以在兒童收藏中,對嗎? –

+0

@MareInfinitus:圖形是樹狀的,所以沒有周期。基本上,我從一些節點開始,檢查它是否是正確的標籤,如果不是,請轉到父級並再次檢查標籤,依此類推,直到它符合所需的標籤。一旦匹配。我需要比較'SelfReference'的'Id'和給定的'Id'。我試圖在圖片中給出一個圖形例子,我正在尋找具有'parent.ChildLabel ==「exampleLabel」'的節點。 –

+0

LINQ本身並不是遞歸查詢的最佳工具,當它被轉換爲SQL時,情況會更糟。但是,試着想一個簡單的SQL語句來完成這個工作 - 不能完成。在普通SQL中進行遞歸查詢需要通用表格表達式。沒有任何支持的東西。通常最好的選擇是使用CTE的視圖,否則:每個級別的查詢。 –

回答

0

達到你想要什麼,我會提供一個SelfReferencing方法確實爲標籤通過搜索對象圖。

應該是這樣的:(!警告,尚未測試)

public bool ContainsLabel(string label) 
    { 
     if (this.ChildLabel.Equals(label)) 
     { 
      return true; 
     } 
     else 
     { 
      foreach (var child in Children) 
      { 
       return child.ContainsLabel(label); 
      } 
     } 

     return false; 
    } 

可以按如下方式使用它,那麼:

在閱讀了更多的便利
var result = nhibernateSession 
    .Query<Queried>() 
    .Where(queried => queried.SelfReferencing.ContainsLabel("exampleLabel")) 
    .ToList(); 

編輯。

+0

你爲什麼要將'exampleId'傳遞給名爲'label'的局部變量? –

+0

這是您示例代碼中的exampleId。它用於與'SelfReferencing'樹中的標籤進行比較,以確定它是否被包含。我誤解了你的例子嗎? –

+0

我不明白你爲什麼要用標籤比較id並且使用id:'this.ChildLabel.Equals(label)'。而匹配的標籤節點只能是當前的一個或一個祖先,那麼爲什麼你要走下樹呢?很抱歉,經過這麼多時間回答,一直在忙着嘗試可能性。 –