自引用实体上的Linq查询条件

本文关键字:查询 条件 Linq 实体 自引用 | 更新日期: 2023-09-27 17:57:49

我正在尝试从数据库中检索类型为Queried的所有实体,其中Referenced属性或其祖先的标签(表示引用.Prent.ChildLabel)等于某个给定的标签值exampleLabelId等于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; }
}

如有任何关于如何实现这一目标的帮助,我们将不胜感激:)

自引用实体上的Linq查询条件

为了实现您想要的,我将在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();

为了阅读更方便而编辑。