提交 | 用户 | 时间
|
e46d3b
|
1 |
using System; |
懒 |
2 |
using System.Collections.Generic; |
|
3 |
using System.Linq; |
|
4 |
using System.Linq.Expressions; |
|
5 |
using System.Text; |
|
6 |
|
|
7 |
namespace YX.BLL |
|
8 |
{ |
|
9 |
public static class PredicateBuilder |
|
10 |
{ |
|
11 |
|
|
12 |
/// <summary> |
|
13 |
/// 机关函数应用True时:单个AND有效,多个AND有效;单个OR无效,多个OR无效;混应时写在AND后的OR有效 |
|
14 |
/// </summary> |
|
15 |
/// <typeparam name="T"></typeparam> |
|
16 |
/// <returns></returns> |
|
17 |
public static Expression<Func<T, bool>> True<T>() { return f => true; } |
|
18 |
|
|
19 |
/// <summary> |
|
20 |
/// 机关函数应用False时:单个AND无效,多个AND无效;单个OR有效,多个OR有效;混应时写在OR后面的AND有效 |
|
21 |
/// </summary> |
|
22 |
/// <typeparam name="T"></typeparam> |
|
23 |
/// <returns></returns> |
|
24 |
public static Expression<Func<T, bool>> False<T>() { return f => false; } |
|
25 |
|
|
26 |
public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> expr1, Expression<Func<T, bool>> expr2) |
|
27 |
{ |
|
28 |
var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>()); |
|
29 |
return Expression.Lambda<Func<T, bool>>(Expression.Or(expr1.Body, invokedExpr), expr1.Parameters); |
|
30 |
} |
|
31 |
|
|
32 |
public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expr1, Expression<Func<T, bool>> expr2) |
|
33 |
{ |
|
34 |
var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>()); |
|
35 |
return Expression.Lambda<Func<T, bool>>(Expression.And(expr1.Body, invokedExpr), expr1.Parameters); |
|
36 |
} |
|
37 |
} |
|
38 |
} |