【发布时间】:2013-03-23 16:37:45
【问题描述】:
我正在使用此代码动态构建 LINQ 查询。 它似乎有效,但是当我的搜索中有多个 searchString 时,(所以当添加多个表达式时,我收到以下错误:
从范围引用的类型变量“p”,但未定义**
我想我只能定义 /use p 一次。但是,如果是这样,我需要稍微修改一下我的代码。谁能在这里指出我正确的方向?
if (searchStrings != null)
{
foreach (string searchString in searchStrings)
{
Expression<Func<Product, bool>> containsExpression = p => p.Name.Contains(searchString);
filterExpressions.Add(containsExpression);
}
}
Func<Expression, Expression, BinaryExpression>[] operators = new Func<Expression, Expression, BinaryExpression>[] { Expression.AndAlso };
Expression<Func<Product, bool>> filters = this.CombinePredicates<Product>(filterExpressions, operators);
IQueryable<Product> query = cachedProductList.AsQueryable().Where(filters);
query.Take(itemLimit).ToList(); << **error when the query executes**
public Expression<Func<T, bool>> CombinePredicates<T>(IList<Expression<Func<T, bool>>> predicateExpressions, Func<Expression, Expression, BinaryExpression> logicalFunction)
{
Expression<Func<T, bool>> filter = null;
if (predicateExpressions.Count > 0)
{
Expression<Func<T, bool>> firstPredicate = predicateExpressions[0];
Expression body = firstPredicate.Body;
for (int i = 1; i < predicateExpressions.Count; i++)
{
body = logicalFunction(body, predicateExpressions[i].Body);
}
filter = Expression.Lambda<Func<T, bool>>(body, firstPredicate.Parameters);
}
return filter;
}
【问题讨论】:
-
我不太明白。您的
CombinePredicates似乎需要n表达式和n-1运算符。但是,在您调用它的地方,您有一个长度为1的运算符数组。如果要加入的谓词超过2,我预计会出现超出数组范围的异常。 -
我确实看到了,我拿出一些东西让我的例子更紧凑。但我会改变我的问题,使这部分在技术上是正确的。
-
我更正了那部分。但问题仍然存在。
-
当您尝试组合 1 个谓词时是否有效(CombinePredicates 中的循环不会执行,该方法应该只返回谓词)?
-
这是否与以下问题相同:stackoverflow.com/questions/13967523/…
标签: c# linq expression-trees