NHibernate组合并使用OR
本文关键字:OR 合并 组合 NHibernate | 更新日期: 2023-09-27 17:59:01
我的过滤器中有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组合在一个查询中?
我想说,第一部分(您已经有了)是可以的,第二部分也非常简单。处理方式可能是:
// 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)
}
此外,我会在if
内部的某个地方CreateAlias
——接近决定是否需要JOIN(基于搜索参数)。除非你在其他地方查。
也许可以尝试将if
转移到方法中。他们可以接受restrictions
和criteria
并决定如何处理它们。就像这个
RestrictOwner (filter, restrictions, criteria);
RestrictWatcher(filter, restrictions, criteria);
RestrictCreator(filter, restrictions, criteria);
if(restrictions.Count ...
后来,它们可能会变得更加通用。。。