我想從數據庫中檢索Queried
類型的所有實體,其中Referenced
屬性或其祖先的標籤(意爲referenced.Parent.ChildLabel)等於某個給定標籤值exampleLabel
,有Id
等於exampleId
。Linq在自引用實體上的查詢條件
我試着使用:
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
。
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; }
}
就如何實現這一目標的任何幫助,將不勝感激:)
你能提供一個樣品對象圖嗎?只是爲了看看你的自我參照如何工作。你的父母可以在兒童收藏中,對嗎? –
@MareInfinitus:圖形是樹狀的,所以沒有周期。基本上,我從一些節點開始,檢查它是否是正確的標籤,如果不是,請轉到父級並再次檢查標籤,依此類推,直到它符合所需的標籤。一旦匹配。我需要比較'SelfReference'的'Id'和給定的'Id'。我試圖在圖片中給出一個圖形例子,我正在尋找具有'parent.ChildLabel ==「exampleLabel」'的節點。 –
LINQ本身並不是遞歸查詢的最佳工具,當它被轉換爲SQL時,情況會更糟。但是,試着想一個簡單的SQL語句來完成這個工作 - 不能完成。在普通SQL中進行遞歸查詢需要通用表格表達式。沒有任何支持的東西。通常最好的選擇是使用CTE的視圖,否則:每個級別的查詢。 –