NHibernate-需要ICriteria查询帮助吗

NHibernate-需要ICriteria查询帮助吗,nhibernate,icriteria,Nhibernate,Icriteria,我无法按条件使查询正常工作 我想按用户ID筛选UserPublications集合,但它不进行筛选。但ClientPublications集合已正确筛选 有什么建议吗 提前谢谢 public IList<ClientReport> GetAvailableClientReports(int userId) { ICriteria criteria = NHibernateSession.CreateCriteria(typeof(ClientReport))

我无法按条件使查询正常工作

我想按用户ID筛选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);
    }
public IList GetAvailableClientReports(int userId)
{
ICriteria标准=NHibernateSession.CreateCriteria(类型(ClientReport))
.CreateCriteria(“客户出版物”)
.Add(表达式.Eq(“IsDownloaded”,true))
.SetResultTransformer(标准距离)
.AddOrder(Order.Asc(“名称”))
.CreateCriteria(“用户出版物”)
.CreateAlias(“客户端用户”、“用户”)
.Add(Expression.Eq(“user.UserId”,UserId));
返回GetByCriteria(criteria);
}

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

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

Id属性是NHibernate中的一个特例,为什么不为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存在的位置并创建可能不起作用的连接(错误或其他)

对于将来的引用,我通过在映射文件中添加一个过滤器使其起作用

首先在父类映射中定义筛选器:

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

你能把实际的用户传进来吗?然后replace.Add(Expression.Eq(“user.UserId”,UserId));with.Add(Expression.Eq(“user”,user));这没什么区别,不过还是要谢谢你。不一定。两种方法都是平等的。从文档中可以看出:“特殊属性(小写)id可用于引用对象的唯一标识符。(您也可以使用其属性名称。)”我认为只有.id选项有效,因此答案是无用的,同时考虑到“id”应以小写形式书写。:)这也没什么区别,不过还是要谢谢你。有趣的是,当第一次执行查询时,NHibernate甚至不查询UserPublication表。直到我开始在调试器中向下钻取时,才会执行更多的查询,但是它会获取所有的UserPublication行,并且不受用户id的限制。这当然是由于延迟加载而发生的。尽管如此,在执行条件查询时,我仍然希望NHibernate查询UserPublication表,但显然没有发生这种情况。嗯……这个解决方案是通过这篇文章获得的
<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>
NHibernateSession.EnableFilter("userFilter").SetParameter("userId", userId);
ICriteria criteria = NHibernateSession.CreateCriteria(typeof(ClientReport))
            .CreateCriteria("ClientPublications")
            blah blah blah                   
return GetByCriteria(criteria);