我正在使用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>();
}
答案 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);
}