NHibernate组合并使用OR

本文关键字:OR 合并 组合 NHibernate | 更新日期: 2023-09-27 17:59:01

我的过滤器中有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组合在一个查询中?

NHibernate组合并使用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转移到方法中。他们可以接受restrictionscriteria并决定如何处理它们。就像这个

RestrictOwner  (filter, restrictions, criteria);
RestrictWatcher(filter, restrictions, criteria);
RestrictCreator(filter, restrictions, criteria);
if(restrictions.Count ...

后来,它们可能会变得更加通用。。。