Expression用于实现动态的查询语句
例子:
int[] intlist = { 1, 3, 5, 7, 9 };
List<int> result = new List<int>();
Expression<Func<int, string>> me = a => a.ToString();
//MessageBox.Show(me.Compile()(66));
Expression<Func<int, bool>> exp0 = a => a>5 ;
Expression<Func<int, bool>> exp1 = b => b<9;
// Expression<Func<int, int>> temp= PredicateBuilder.Or<int>(t0,t1);
Expression<Func<int, bool>> temp1=exp0.And(exp1);
Func < int, bool> kk = exp0.And(exp1).Compile();
result = intlist.Where(exp0.And(exp1).Compile()).ToList();
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 = System.Linq.Expressions.Expression.Invoke(expr2, expr1.Parameters.Cast<System.Linq.Expressions.Expression>());
return Expression.Lambda<Func<T, bool>>
(Expression.OrElse(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.AndAlso(expr1.Body, invokedExpr), expr1.Parameters);
}
}