C# 列表上的动态Linq查询<;T>;使用谓词生成器

C# 列表上的动态Linq查询<;T>;使用谓词生成器,c#,linq,predicatebuilder,C#,Linq,Predicatebuilder,我正在使用C#2010.NET4.0,我有一个名为returns的列表集合,我需要在其上构建动态LINQ查询 我正在使用引用的谓词生成器 如果我有1个筛选条件,这很好,但是如果我有2个或更多筛选条件,那么当调用query.compile()时,我会得到以下错误: 引用的“Check21Tools.IncomingReturn”类型的变量“tmp” 作用域“”,但未定义它 代码: 表达式查询=null; bool hasFilterItems=false; 如果(filterArray!=null

我正在使用C#2010.NET4.0,我有一个名为
returns
列表
集合,我需要在其上构建动态LINQ查询

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

如果我有1个筛选条件,这很好,但是如果我有2个或更多筛选条件,那么当调用
query.compile()
时,我会得到以下错误:

引用的“Check21Tools.IncomingReturn”类型的变量“tmp” 作用域“”,但未定义它

代码:

表达式查询=null;
bool hasFilterItems=false;
如果(filterArray!=null)
{
foreach(filterArray中的字符串s)
{
如果(s==string.Empty)
{break;}
其他的
{
hasFilterItems=true;
Int64 id=Int64.Parse;
query=query.Or(tmp=>tmp.ID==ID);
}
}
}
if(hasFilterItems)
{
returns=returns.Where(query.Compile()).CreateFromEnumerable
();
} 
代码:

公共静态表达式或(
此表达式(expr1,expr2)
{
if(expr1==null)返回expr2;
返回表达式.Lambda
(Expression.OrElse(expr1.Body,expr2.Body),expr1.Parameters);
}

[操作程序]偶然发现了一个更新版本的谓词生成器,它可以在
列表
对象上工作:

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);
  }
公共静态表达式或(此表达式expr1,表达式expr2)
{
if(expr1==null)返回expr2;
var invokedExpr=Expression.Invoke(expr2,expr1.Parameters.Cast());
返回表达式.Lambda
(Expression.OrElse(expr1.Body,invokedExpr),expr1.Parameters);
}

如果您使用的是
列表
,为什么要构建
表达式
?你可以直接委托。你能给我一个动态委托的例子吗?我的
filterArray
对象包含我需要筛选的id。有关不使用表达式树的PredicateBuilder版本,请参阅。-1:您没有使用链接到的PredicateBuilder。您链接到的PredicateBuilder提供了一个不同的
方法。@ShawnHollon那么您实际上想做什么?您的查询结果应该是什么?
 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);

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