NHibernate组合并使用OR

时间:2014-04-18 21:58:06

标签: c# asp.net-mvc-4 nhibernate

我的过滤器中有3个变量: int? Ownerint? Watcherint? 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结合起来?

1 个答案:

答案 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移到方法中。他们可以restrictionscriteria来决定如何处理它们。就像这样

RestrictOwner  (filter, restrictions, criteria);
RestrictWatcher(filter, restrictions, criteria);
RestrictCreator(filter, restrictions, criteria);

if(restrictions.Count ...

之后,他们可能会更加通用......