我正在尝试从数据库中检索Queried
类型的所有实体,其中Referenced
属性或它的祖先,其标签(含义为referenced.Parent.ChildLabel)等于某个给定的标签值{ {1}},exampleLabel
等于Id
。
我尝试使用:
exampleId
但是它会抛出“System.NotSupportedException”,可能是因为它不知道如何将var result = nhibernateSession
.Query<Queried>()
.Where(queried => queried.SelfReferencing.GetSelfOrAncestor("exampleLabel") == exampleId)
.ToList();
翻译成SQL。
方法GetSelfOrAncestor
返回调用它的GetSelfOrAncestor(string label)
实例的Id
,或者它的祖先符合SelfReferencing
等于this.Parent.ChildLabel
的条件},否则返回0.
例如,在下图中,如果exampleLabel
指向queried.SelfReferencing
处的Level 2
,GetSelfOrAncestor("exampleLabel")
将返回Id
处对象的Level 1
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)
为了达到你想要的效果,我会在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();
为了更方便阅读而编辑。