PredicateBuilder使用详解
时间:2014-07-22 16:29 来源: 我爱IT技术网 作者:山风
PredicateBuilder 提供了以 OR 串接 bool 的 Lambda Expression,使用上会像下面的程序:
- var predicate = PredicateBuilder.False<Product>();
- predicate = predicate.Or(p => p.Name == 'Shoe');
- predicate = predicate.Or(p => p.Price > 100);
它的源代码如下:
- 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.OrElse (expr1.Body, invokedExpr),
- expr1.Parameters
- );
- }
上面的程序虽然不长,但实在有点小难懂?让我逐步解释吧!
假设 expr1 是 x => x.Name == 'Shoe'
假设 expr2 是 y => y.Price > 100
- var invokedExpr = Expression.Invoke(
- expr2,
- expr1.Parameters.Cast<Expression>()
- );
先组合出( 利用 expr1 的参数去执行 expr2 )的表示式 invokedExpr
产生出了语法会像 (y => y.Price > 100) (x)
- Expression.OrElse(expr1.Body, invokedExpr)
将 expr1.Body 与 invokedExpr 以 || 运算符组合起来
产生出了语法会像 x => x.Name == 'Shoe' || (y => y.Price > 100) (x)
- Expression.Lambda<Func<T, bool>>(
- Expression.OrElse(expr1.Body, invokedExpr),
- expr1.Parameters
- );
将刚刚组合好的 || 运算表示式再组合成 Lambda 表示式
产生出了语法会像 x => (x => x.Name == 'Shoe' || (y => y.Price > 100) (x))
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
