List <t>上的动态Linq查询使用Predicate Builder </t>

时间:2013-03-20 17:01:22

标签: c# linq predicatebuilder

我正在使用C#2010 .NET 4.0,我有一个名为List<T>的{​​{1}}集合,我需要在其上构建动态LINQ查询。

我正在使用引用here的Predicate Builder。

如果我有1个过滤条件,这可以正常工作,但如果我有2个或更多,那么,当调用returns时,我会收到此错误:

  

引用的'Check21Tools.IncomingReturn'类型的变量'tmp'   范围'',但未定义

代码:

query.compile()

代码:

  Expression<Func<Check21Tools.IncomingReturn, bool>> query = null;

  bool hasFilterItems = false;
  if (filterArray != null)
  {
    foreach (string s in filterArray)
    {
      if (s == string.Empty)
      { break; }
      else
      {
        hasFilterItems = true;
        Int64 id = Int64.Parse(s);
        query = query.Or(tmp => tmp.ID == id);
      }

    }
  }
  if (hasFilterItems)
  {
    returns = returns.Where(query.Compile()).CreateFromEnumerable
                  <Check21Tools.IncomingReturns, Check21Tools.IncomingReturn>();
  } 

1 个答案:

答案 0 :(得分:0)

[OP已经]偶然发现了对List<T>个对象起作用的谓词构建器的更新版本:

public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> expr1, Expression<Func<T, bool>> expr2)
  {
     if (expr1 == null) return expr2;
     var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());
     return Expression.Lambda<Func<T, bool>>
              (Expression.OrElse(expr1.Body, invokedExpr), expr1.Parameters);
  }