我无法按条件查询我的查询。
我想通过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);
}
答案 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);