0

我正在QueryOver<T>Expression<Func<T, bool>>. 现在我的对象迭代列表并添加queryOver.Where(item)被视为逻辑与的表达式。我现在希望改变它,以便给定一个指定的参数,它切换到使用逻辑 OR 附加项目,但我不知道如何做到这一点......谁能给我一个正确方向的指针?

4

1 回答 1

0

使用 OR 动态构建限制条件并不是特别简单。在Joel Potter 的博客文章中找到的方法非常好。此方法使用扩展方法向OrQueryOver 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);
    }
  }
}

然后可以使用此扩展方法构造ORed 约束:

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

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

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

于 2013-05-09T21:42:38.353 回答