2017-10-10 274 views
0

對NHibernate來說是相對新的我已經繼承了一些我必須修改的基本代碼。我有一堆類型爲Group的對象。每個組可以有一個或多個類型爲Group的孩子,孩子也可以有Group類型的孩子等等。每個Group對象都有一個名爲Deleted的屬性/字段,其值爲「deletedgroup」(一種軟刪除)。如果一個組的「已刪除」字段設置爲「已刪除組」,則不應該選擇,所以兒童和大孩子也應該這樣選擇。換句話說,我需要獲得沒有將刪除字段設置爲「已刪除組」的所有組的列表。 我有這段代碼被繼承,但它沒有包含新的刪除字段的標準,即代碼檢索所有組。 如何擴展代碼以滿足我的請求。我已經嘗試過.Where和.Criteria,但是我得到了編譯錯誤和限制不起作用。NHibernate獲取包括兒童和一個條件

Enherited代碼(選擇所有組):

var allGroups = ObjectFactory.GetInstance<IUnitOfWork>().Session 
         .QueryOver<Group>() 
         .Fetch(g => g.ChildGroups).Eager 
         .Fetch(g => g.Vacancies).Eager 
         .TransformUsing(new DistinctRootEntityResultTransformer()) 
         .List(); 

回答

0

我通常有利於LINQ查詢與NH因爲我發現的語法更直觀。 NH的LINQ提供商並不完美,有時候QueryOver遠遠優於此。然而,在這種情況下,我覺得這LINQ基於查詢應爲你工作:

var activeGroupIds = 
    ObjectFactory.GetInstance<IUnitOfWork>().Session 
     .Query<Group>() 
     .Where(g => g.Deleted != "deletedgroup") 
     .Select(g => g.Id); 

var allGroups = 
    ObjectFactory.GetInstance<IUnitOfWork>().Session 
     .Query<Group>() 
     .FetchMany(g => g.ChildGroups) 
     .FetchMany(g => g.Vacancies) 
     .Where(g => activeGroupIds.Contains(g.Id)) 
     .ToList(); 

也許試試這個,看看它是否有預期的效果。

+0

沒有工作。看起來像where子句過濾出每個組,所以結果爲零組,就像我經歷過使用帶有where子句的orignal查詢一樣。 省略where子句將返回所有組作爲原始查詢。 – Torben

+0

啊。那麼你是否需要類似相關的子查詢,它首先找到符合條件的組並使用「Deleted!=」deletedgroup「',然後只返回該列表中的組? –

+0

我用這個概念編輯了我的答案,但我不確定這正是你要找的。 –