2011-06-27 72 views
0

我有一個樹結構的問題,並將過濾器應用到樹根。我需要使用NHibernate標準來創建一個查詢,這個標準將把過濾器應用到樹的根部(可以有多個樹,我需要提供根的ID)。在普通的SQL,這將看某事像:NHibernate和遞歸查詢過濾器

WITH c (Node, Parent, Child, LEVEL) 
     AS (SELECT N.CatalogNodeId , 
        N.ParentCatalogNodeId , 
        N.CatalogNodeId , 
        CAST(0 AS BIGINT) 
      FROM  CatalogNode N 
      WHERE N.ParentCatalogNodeId IS NULL 
      UNION ALL 
      SELECT C.Node , 
        N.ParentCatalogNodeId , 
        N.CatalogNodeId , 
        C.Level + 1 
      FROM  CatalogNode N 
        JOIN c ON C.Child = n.ParentCatalogNodeId 
     ) 
SELECT 
     c.Child 
FROM c 
     JOIN dbo.CatalogItem CI ON Ci.CatalogNodeId = c.Child 
     JOIN dbo.Item I ON I.ItemId = CI.ItemId 
WHERE C.Node = @Node_Id 

該查詢返回正是我想要的,但它只是更大的查詢的一部分。我需要的是使用標準API來創建相同的結果:具有給定根ID的項目列表(保持樹結構不是必需的 - 這是「搜索」命令的結果,因此只是一組條目是需要)。不幸的是,我不是NHibernate的專家,所以...任何指南,想法都會有所幫助。

回答

1

我的建議是,你現在保持你的SQL。甚至不要嘗試用Criteria來做這件事。

執行上述遞歸查詢:

+0

我會,但正如我所說,這只是更大的處理的一部分,其餘使用標準api。據我所知,在單個查詢(或不是?)中混合使用普通sql ad標準api是不可能的,所以我必須找到一些方法將此過濾器添加到現有代碼中。 – user817409

+0

@ user817409:無法在同一查詢中混用它們,這是正確的。但是,沒有一個本地NH API支持遞歸查詢,所以如果你需要的話,你會被SQL困住。 –

0

Expression.SQL(),會使相關的SQL WHERE子句...那說你可以在你的方法應用兩步過程,你可以混合使用SQL標準,但不是一個CTE在普通的sql中,它返回某種類型的Id(c.Child),並且該產品可以與Restrictions.Eq一起使用(如果它是單行)或Restrictions.In(對於返回的ids集合)。