Lambda表达式创建AND过滤器

时间:2017-11-06 15:48:58

标签: c# asp.net linq lambda linqkit

我使用此代码创建搜索过滤器。

我需要传递一组数据并通过AND过滤这些数据。

Expression<Func<serveis, bool>> CombineWithAnd<T>(Expression<Func<T, bool>> firstExpression, Expression<Func<T, bool>> secondExpression)
{            
    var parameter = Expression.Parameter(typeof(T), "z");            
    var resultBody = Expression.AndAlso(Expression.Invoke(firstExpression, parameter), Expression.Invoke(secondExpression, parameter));

    return Expression.Lambda<Func<serveis, bool>>(resultBody, parameter);    
}

然后:

Expression<Func<T, bool>> resultExpression = n => false;     

foreach (var car in cars)
{    
    Expression<Func<T, bool>> expression = x => x.color_car.Any(z => z.car == car);
    resultExpression = CombineWithAnd(resultExpression, expression);
}

query = query.Where(resultExpression.Compile());

如果我使用OR或OrElse使用相同的代码,搜索工作正常。

但是我还需要通过AND或AndAlso执行搜索,它总是返回零结果。

我已经检查了数据库,并且有AND和OR结果。

1 个答案:

答案 0 :(得分:4)

对于AND,您应该替换起始的“左侧”:

Expression<Func<T, bool>> resultExpression = n => false; 

使用:

Expression<Func<T, bool>> resultExpression = n => true; 

因为目前左侧无论右侧是否都会失败