NHibernate - 需要ICriteria查询帮助

时间:2009-09-17 16:04:41

标签: 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);
    }

3 个答案:

答案 0 :(得分:0)

如果您在映射文件中将UserId属性映射为“Id”(如果您使用与this question中相同的约定,则可能会这样做),它应该是:

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

Id属性是NHibernate

中的一个特例

答案 1 :(得分: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存在位置的能力并创建可能无法正常工作的连接(bug或其他)

答案 2 :(得分:0)

对于将来的ref,我通过在映射文件中添加过滤器来实现它

首先在父类映射中定义过滤器:

<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);