2009-09-17 122 views
0

我無法通過標準獲取我的查詢工作。NHibernate - 需要幫助與ICriteria查詢

我想通過userId過濾UserPublications集合,但它不是過濾。 ClientPublications集合已經正確過濾。

有什麼建議嗎?

在此先感謝。

public IList<ClientReport> GetAvailableClientReports(int userId) 
    { 
     ICriteria criteria = NHibernateSession.CreateCriteria(typeof(ClientReport)) 
      .CreateCriteria("ClientPublications")     
      .Add(Expression.Eq("IsDownloaded", true)) 
      .SetResultTransformer(CriteriaUtil.DistinctRootEntity) 
      .AddOrder(Order.Asc("Name")) 
      .CreateCriteria("UserPublications")      
      .CreateAlias("ClientUser", "user") 
      .Add(Expression.Eq("user.UserId", userId)); 

     return GetByCriteria(criteria); 
    } 
+1

你可以通過實際的用戶嗎?然後替換.Add(Expression.Eq(「user.UserId」,userId));與.Add(Expression.Eq(「user」,user)); – mxmissile 2009-09-17 16:08:15

+0

這沒有什麼區別,不過謝謝。 – empo 2009-09-18 08:51:00

回答

0

對於未來的參考,我通過在映射fi中添加一個過濾器樂

首先定義在父類映射過濾器:

<filter-def name="userFilter"> 
    <filter-param name="userId" type="System.Int32"/> 
</filter-def> 

然後在映射進一步定義過濾器,以收集

<bag name="UserPublications" access="property" lazy="true" cascade="all-delete-orphan">  
    <key column="ClientPublicationID"/> 
    <one-to-many class="ReportMgr.Model.ClientUserPublication, ReportMgr.Model" /> 
    <filter name="userFilter" condition="ClientUserID = :userId"></filter> 
</bag> 

然後啓用過濾器和之前指定的參數值執行ICriteria查詢:

NHibernateSession.EnableFilter("userFilter").SetParameter("userId", userId); 
ICriteria criteria = NHibernateSession.CreateCriteria(typeof(ClientReport)) 
      .CreateCriteria("ClientPublications") 
      blah blah blah     
return GetByCriteria(criteria); 
+0

這個解決方案是通過這個帖子得到的 http://ayende.com/Blog/archive/2009/05/04/nhibernate-filters.aspx – empo 2009-09-18 14:28:33

0

如果你映射了UserID屬性爲你的映射文件「ID」(如果使用相同的約定爲this question你可能做的),它應該是:

.Add(Expression.Eq("user.Id", userId)) 

的標識屬性是NHibernate中的一個特例

+0

如果他的Id屬性被稱爲UserId,那麼他應該使用'UserId'... – 2009-09-17 16:37:54

+0

不一定。兩種方式都是平等的。從文檔: 「特殊屬性(小寫)ID可用於引用對象的唯一標識符(您也可以使用其屬性名稱)。」 我以爲只有.Id選項是有效的,所以答案是無用的,同樣考慮到「id」應該寫成小寫。 :) – 2009-09-17 18:43:33

+0

這沒有任何區別,但無論如何感謝。 – empo 2009-09-18 08:53:23

0

爲什麼不爲UserPublications創建別名並在其中添加表達式?像

.CreateCriteria("UserPublications", "up")      
.Add(Expression.Eq("up.ClientUser.UserId", userId)); 

也許

.CreateCriteria("UserPublications", "up")      
.CreateAlias("up.ClientUser", "user") 
.Add(Expression.Eq("user.UserId", userId)); 

,據我可以看到調用

.CreateAlias("ClientUser", "user") 

取決於NH的檢測能力,其中ClientUser存在,並創建聯接可能無法正常工作(錯誤或其他)

+0

這也沒有任何區別,但無論如何感謝。有趣的是,當第一次執行查詢時,NHibernate甚至不查詢UserPublication表。直到我開始在調試器中鑽取更多查詢時才執行,但是它獲取所有UserPublication行並且不受用戶標識限制。由於延遲加載,這正如預期的那樣發生。儘管如此,我仍然希望NHibernate在執行條件查詢時查詢UserPublication表,但顯然這沒有發生。 hmmmmmmmmmmmmm ...... – empo 2009-09-18 13:50:49