使用NHibernate的QueryOver API的嵌套集查询
我使用存储类别的层次结构,也就是说,每个类别都有一个左值和一个右值,每个类别都有一个比任何父级更高的左值和一个更小的右值 我想查询属于某个类别(包括该类别)的子类别的所有类别。也就是说,我需要从给定类别开始的整个子树 如果子树根的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,但这是另一个问题使用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
有没有更好的方法来实现这一点?如果有必要,我可以为这种情况切换查询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使用相同的查询计划。