使用NHibernate的QueryOver API的嵌套集查询

使用NHibernate的QueryOver API的嵌套集查询,nhibernate,queryover,nested-sets,Nhibernate,Queryover,Nested Sets,我使用存储类别的层次结构,也就是说,每个类别都有一个左值和一个右值,每个类别都有一个比任何父级更高的左值和一个更小的右值 我想查询属于某个类别(包括该类别)的子类别的所有类别。也就是说,我需要从给定类别开始的整个子树 如果子树根的id由@catId给出,我可以使用以下SQL获取子树: 选择* c类,, 从类别中选择[Left]、[Right],其中Id=@catId为t 其中c.[Left]>=t.[Left] 和c.[右]x.左>=类别左和&x.右x.左 格奎约弗 .c=>c.Id==catI

我使用存储类别的层次结构,也就是说,每个类别都有一个左值和一个右值,每个类别都有一个比任何父级更高的左值和一个更小的右值

我想查询属于某个类别(包括该类别)的子类别的所有类别。也就是说,我需要从给定类别开始的整个子树

如果子树根的id由@catId给出,我可以使用以下SQL获取子树:

选择* c类,, 从类别中选择[Left]、[Right],其中Id=@catId为t 其中c.[Left]>=t.[Left] 和c.[右]x.左>=类别左和&x.右x.左 格奎约弗 .c=>c.Id==catId .选择c=>c.左 .WithSubquery.WherePropertyx=>x.右 莱克约弗 .c=>c.Id==catId .Selectc=>c.Right.List; 除此之外,并非所有DBMS都支持返回标量值的子查询,如SqlServerCE,但这是另一个问题


有没有更好的方法来实现这一点?如果有必要,我可以为这种情况切换查询API。因此,如果在HQL中有一种简洁的方法可以做到这一点,那么我对此很满意。

我想得到一个子树,包括嵌套集中的树,应该类似于SQL:-

SELECT 
    node.*
FROM 
    Category AS node,
    Category AS parent
WHERE 
    node.left BETWEEN parent.left AND parent.right
    AND parent.TreeID = @catID
ORDER BY 
    node.left;
这将使用在QueryOver AFAIK中不可能的交叉连接


但是,这两种方法都是可能的,甚至更好。

使用Linq就成功了。我最初的查询在语义上做了相同的交叉连接,只是表达方式不同而已。NHibernate生成的linq查询使用完全相同的查询计划。谢谢!太好了,很高兴能帮上忙。我想知道查询之间的差异,很高兴看到SQLServer使用相同的查询计划。