2013-01-17 50 views
2

有沒有加載NHibernate實體的方法,在子集合上有一個子句?我有一個場景,在「操作」中記錄更改,即一個操作可以包含對多個實體的更改。當我想要加載特定實體的日誌時,我加載了對該實體進行的任何更改的所有操作。加載這些操作會導致加載所有更改 - 我只希望加載相關更改。NHibernate負載實體與子集合的一部分

類:

public class Operation{ 
    public virtual DateTime TimeStamp { get; set; } 
    public virtual IList<Change> Changes { get; private set; } 
} 

public class Change{ 
    public virtual string ChangeText { get; set; } 
    public virtual int EntityId { get; set; } 
} 

獲取操作對於給定的實體

Session.QueryOver<Operation>().Where(o => o.Changes.Any(c => c.EntityId == entityId)); 

回答

0

一,在本奧斯卡·伯格倫的回答說:https://stackoverflow.com/a/13864061/1679310 您可以應用過濾器18.1. NHibernate filters

摘要:

調整你的映射

<set ...> 
    <filter name="myFilter" condition=":myFilterParam = MY_FILTERED_COLUMN"/> 
</set> 

然後調用它是這樣的:

ISession session = ...; 
session.EnableFilter("myFilter").SetParameter("myFilterParam", "some-value"); 
IList results = Session.QueryOver<Operation>() 
    .Where(... 
    .List(); 

II。另一種選擇是quering當過濾ChangesOperation16.4. Associations

IQueryOver<Operation,Change> query = 
session.QueryOver<Operation>() 
    .JoinQueryOver<Change>(o => o.Changes) // added explicit <Change> 
    .Where(c => c.EntityId == entityId); 
+0

我喜歡選項II,但在過去的「C」則是變化的集合,而不是每個項目更改...看起來它必須就像'Where(cl => cl.Where(c => c.EntityId == entityId))'',但是這個目前給我一個編譯錯誤.. – hazard

+0

'session.QueryOver () .JoinQueryOver(o => o.Changes) 。這裏(c => c.EntityId == entityId);'給我一個編譯器錯誤,因爲c是IList ,而不是更改 – hazard

+0

我更新了我的答案。 JoinQueryOver應該與''一起提供。現在它應該工作。更多信息和細節可以在文檔中找到:http://nhforge.org/doc/nh/en/index.html#queryqueryover-associations –