0

我无法按标准进行查询。

我想按 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);
    }
4

3 回答 3

0

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

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

Id 属性是 NHibernate 中的一个特例

于 2009-09-17T16:28:04.670 回答
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 存在位置并创建可能不起作用的连接(错误或其他)的能力

于 2009-09-18T09:39:55.030 回答
0

对于未来的参考,我通过在映射文件中添加一个过滤器来让它工作

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

<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);
于 2009-09-18T14:26:49.563 回答