自引用实体上的Linq查询条件
本文关键字:查询 条件 Linq 实体 自引用 | 更新日期: 2023-09-27 17:57:49
我正在尝试从数据库中检索类型为Queried
的所有实体,其中Referenced
属性或其祖先的标签(表示引用.Prent.ChildLabel)等于某个给定的标签值exampleLabel
,Id
等于exampleId
。
我尝试使用:
var result = nhibernateSession
.Query<Queried>()
.Where(queried => queried.SelfReferencing.GetSelfOrAncestor("exampleLabel") == exampleId)
.ToList();
但它抛出了一个"System.NotSupportedException",可能是因为它不知道如何将GetSelfOrAncestor
转换为SQL。
方法GetSelfOrAncestor(string label)
返回调用它的SelfReferencing
实例的Id
,或者它的祖先满足this.Parent.ChildLabel
等于exampleLabel
的条件,否则返回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; }
}
如有任何关于如何实现这一目标的帮助,我们将不胜感激:)
为了实现您想要的,我将在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();
为了阅读更方便而编辑。