0

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

我正在使用此处引用的谓词生成器。

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

从范围“”引用了“Check21Tools.IncomingReturn”类型的变量“tmp”,但未定义

代码:

  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>();
  } 

代码:

 public static Expression<Func<T, bool>> Or<T>(
     this Expression<Func<T, bool>> expr1, Expression<Func<T, bool>> expr2)
 {
     if (expr1 == null) return expr2;

     return Expression.Lambda<Func<T, bool>>
         (Expression.OrElse(expr1.Body, expr2.Body), expr1.Parameters);

 }
4

1 回答 1

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);
  }
于 2013-03-20T17:38:52.000 回答