如何从Expression <func <t,bool =“”>&gt; </func <t,>列表中创建逻辑OR

时间:2013-05-09 19:41:40

标签: nhibernate

我正在从QueryOver<T>列表中构建一个NHibernate Expression<Func<T, bool>>。现在,我的对象迭代列表并使用被视为逻辑AND的queryOver.Where(item)添加表达式。我现在希望改变它,以便给定一个指定的参数,它切换到使用逻辑OR附加项目,但我无法弄清楚如何做到这一点......任何人都可以给我一个指向正确方向的指针吗? / p>

1 个答案:

答案 0 :(得分:0)

使用OR动态构建限制条件并不是特别简单。 Joel Potter's blog post中的方法非常好。此方法使用扩展方法向QueryOver API添加Or方法,该API接受ICriterion数组。

public static class Extensions
{
  public static IQueryOver<troot, tsubtype> 
          Or<troot, tsubtype>(this IQueryOver<troot, tsubtype> input, ICriterion[] criteria)
  {
    if (criteria.Length == 0)
      return input;
    else if (criteria.Length == 1)
      return input.Where(criteria[0]);
    else
    {
      var or = Restrictions.Or(criteria[0], criteria[1]);
      for (int i = 2; i < criteria.Length; i++)
        or = Restrictions.Or(or, criteria[i]);

      return input.Where(or);
    }
  }
}

然后,可以使用此扩展方法构建OR ed约束:

var l = new List<ICriterion>();
foreach(var item in expressionList)
  l.Add(Restrictions.Where(item));

s.QueryOver<Order>()
  .Or(l.ToArray())
  .List();

这应该产生您需要的结果。