我的过滤器中有3个变量:
int? Owner
,int? Watcher
,int? CreatedBy
。
现在,根据在过滤器(if CreatedBy.HasValue
等)中输入的内容,我想在NHibernate中将我的查询与OR语句结合起来。到目前为止我已经
if (filter.Owner.HasValue)
{
criteria.Add(Expression.Disjunction()
.Add(Restrictions.Eq("ou.User.Id", filter.Owner.Value))
.Add(Restrictions.Eq("ou.Status", 0)));
}
if (filter.Watcher.HasValue)
{
criteria.Add(Expression.Disjunction()
.Add(Restrictions.Eq("ou.User.Id", filter.Watcher.Value))
.Add(Restrictions.Eq("ou.Status", 1)));
}
if (filter.CreatedBy.HasValue)
{
criteria.Add(Restrictions.Eq("u.Id", filter.CreatedBy));
}
之前,我添加了createAlias等...但是,如何根据在过滤器中输入的变量将一个查询中的3个查询与OR结合起来?
答案 0 :(得分:1)
我会说,第一部分(你已经拥有)是好的,第二部分也很简单。如何处理的方式可能是:
// this would be the collector of criteria
var restrictions = new List<ICriterion>();
if (filter.Owner.HasValue)
{
restrcitons.Add(Expression.Disjunction()
.Add(Restrictions.Eq("ou.User.Id", filter.Owner.Value))
.Add(Restrictions.Eq("ou.Status", 0))
);
}
if (filter.Watcher.HasValue)
{
restricitons.Add(Expression.Disjunction()
.Add(Restrictions.Eq("ou.User.Id", filter.Watcher.Value))
.Add(Restrictions.Eq("ou.Status", 1))
);
}
if (filter.CreatedBy.HasValue)
{
restrictions.Add(Restrictions.Eq("u.Id", filter.CreatedBy));
}
// now we can inject the result of the above code into
// Disjunction or Conjunction...
if(restrictions.Count > 0)
{
var disjunction = Restrictions.Disjunction();
restrictions .ForEach(r => disjunction.Add(r));
criteria.Add(disjunction)
}
另外,我会在CreateAlias
内的某个地方if
- 接近决定是否需要JOIN(基于搜索参数)。除非你在其他地方检查。
也许可以尝试将if
移到方法中。他们可以restrictions
和criteria
来决定如何处理它们。就像这样
RestrictOwner (filter, restrictions, criteria);
RestrictWatcher(filter, restrictions, criteria);
RestrictCreator(filter, restrictions, criteria);
if(restrictions.Count ...
之后,他们可能会更加通用......