Linq查询自引用实体的条件

时间:2013-02-05 12:11:32

标签: c# .net linq nhibernate linq-to-nhibernate

我正在尝试从数据库中检索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 2GetSelfOrAncestor("exampleLabel")将返回Id处对象的Level 1

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; }
}

如何实现这一目标的任何帮助都将受到高度赞赏:)

1 个答案:

答案 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();

为了更方便阅读而编辑。