如果是预先知道的多条件可以直接||或者&&把多个条件拼在一起然后放在Where()子句里就可以,不过如果是不确定的条件,就不能用这种方法了,作为一个菜鸟,本来还想着是不是可以一直.Where下去,发现不行

先上辅助扩展类

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
public static class PredicateBuilder
{
    public static Expression<Func<T, bool>> True<T>() 
    { return f => true; }
    public static Expression<Func<T, bool>> False<T>() 
    { return f => false; }
    public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> expr1,Expression<Func<T, bool>> expr2)
    {
        var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());
        return Expression.Lambda<Func<T, bool>>(Expression.Or(expr1.Body, invokedExpr), expr1.Parameters);
    }
    public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expr1, Expression<Func<T, bool>> expr2)
    {
        var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());
        return Expression.Lambda<Func<T, bool>>(Expression.And(expr1.Body, invokedExpr), expr1.Parameters);
    }
}

使用方法很简单,先

1
var Predicate = PredicateBuilder.True<T>();  //T 为需要进行过滤和查询的类型

在循环或者遍历的时候

1
2
3
predicate = predicate.And(lambda);
or
predicate = predicate.Or(lambda);

一步步构建需要的表达式 最后Where(predicate)这样既可